首页编程java反射机制(java中的反射机制是什么,有什么作用啊)

java反射机制(java中的反射机制是什么,有什么作用啊)

编程之家2023-11-01118次浏览

各位老铁们好,相信很多人对java反射机制都不是特别的了解,因此呢,今天就来为大家分享下关于java反射机制以及java中的反射机制是什么,有什么作用啊的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

java反射机制(java中的反射机制是什么,有什么作用啊)

java中反射的三种方法是

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。

反射的好处:大大的增强了程序的扩展性。

反射的基本步骤:

1、获得Class对象,就是获取到指定的名称的字节码文件对象。

2、实例化对象,获得类的属性、方法或构造函数。

3、访问属性、调用方法、调用构造函数创建对象。

java反射机制(java中的反射机制是什么,有什么作用啊)

获取这个Class对象,有三种方式:

1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。

2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。

前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。

3:使用的Class类中的方法,静态的forName方法。

指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符串传入即可。

java反射机制(java中的反射机制是什么,有什么作用啊)

// 1.根据给定的类名来获得用于类加载

String classname="cn.itcast.reflect.Person";//来自配置文件

Class clazz= Class.forName(classname);//此对象代表Person.class

// 2.如果拿到了对象,不知道是什么类型用于获得对象的类型

Object obj= new Person();

Class clazz1= obj.getClass();//获得对象具体的类型

// 3.如果是明确地获得某个类的Class对象主要用于传参

Class clazz2= Person.class;

反射的用法:

1)、需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:

Class.forName(classname)用于做类加载

obj.getClass()用于获得对象的类型

类名.class用于获得指定的类型,传参用

2)、反射类的成员方法:

Class clazz= Person.class;

Method method= clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});

method.invoke();

3)、反射类的构造函数:

Constructor con= clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})

con.newInstance(params...)

4)、反射类的属性:

Field field= clazz.getField(fieldName);

field.setAccessible(true);

field.setObject(value);

获取了字节码文件对象后,最终都需要创建指定类的对象:

创建对象的两种方式(其实就是对象在进行实例化时的初始化方式):

1,调用空参数的构造函数:使用了Class类中的newInstance()方法。

2,调用带参数的构造函数:先要获取指定参数列表的构造函数对象,然后通过该构造函数的对象的newInstance(实际参数)进行对象的初始化。

综上所述,第二种方式,必须要先明确具体的构造函数的参数类型,不便于扩展。所以一般情况下,被反射的类,内部通常都会提供一个公有的空参数的构造函数。

------------------------------------------------------

//如何生成获取到字节码文件对象的实例对象。

Class clazz= Class.forName("cn.itcast.bean.Person");//类加载

//直接获得指定的类型

clazz= Person.class;

//根据对象获得类型

Object obj= new Person("zhangsan", 19);

clazz= obj.getClass();

Object obj= clazz.newInstance();//该实例化对象的方法调用就是指定类中的空参数构造函数,给创建对象进行初始化。当指定类中没有空参数构造函数时,该如何创建该类对象呢?请看method_2();

public static void method_2() throws Exception{

Class clazz= Class.forName("cn.itcast.bean.Person");

//既然类中没有空参数的构造函数,那么只有获取指定参数的构造函数,用该函数来进行实例化。

//获取一个带参数的构造器。

Constructor constructor= clazz.getConstructor(String.class,int.class);

//想要对对象进行初始化,使用构造器的方法newInstance();

Object obj= constructor.newInstance("zhagnsan",30);

//获取所有构造器。

Constructor[] constructors= clazz.getConstructors();//只包含公共的

constructors= clazz.getDeclaredConstructors();//包含私有的

for(Constructor con: constructors){

System.out.println(con);

}

}

------------------------------------------------------

反射指定类中的方法:

//获取类中所有的方法。

public static void method_1() throws Exception{

Class clazz= Class.forName("cn.itcast.bean.Person");

Method[] methods= clazz.getMethods();//获取的是该类中的公有方法和父类中的公有方法。

methods= clazz.getDeclaredMethods();//获取本类中的方法,包含私有方法。

for(Method method: methods){

System.out.println(method);

}

}

//获取指定方法;

public static void method_2() throws Exception{

Class clazz= Class.forName("cn.itcast.bean.Person");

//获取指定名称的方法。

Method method= clazz.getMethod("show", int.class,String.class);

//想要运行指定方法,当然是方法对象最清楚,为了让方法运行,调用方法对象的invoke方法即可,但是方法运行必须要明确所属的对象和具体的实际参数。

Object obj= clazz.newInstance();

method.invoke(obj, 39,"hehehe");//执行一个方法

}

//想要运行私有方法。

public static void method_3() throws Exception{

Class clazz= Class.forName("cn.itcast.bean.Person");

//想要获取私有方法。必须用getDeclearMethod();

Method method= clazz.getDeclaredMethod("method", null);

//私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。

method.setAccessible(true);//一般很少用,因为私有就是隐藏起来,所以尽量不要访问。

}

//反射静态方法。

public static void method_4() throws Exception{

Class clazz= Class.forName("cn.itcast.bean.Person");

Method method= clazz.getMethod("function",null);

method.invoke(null,null);

}

java的反射机制是什么

Java的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean中广泛应用的一种特性。

运用JavaBean的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的一个例子演示了这一实现。

-|Base.java//抽象基类

|Son1.java//基类扩展1

|Son2.java//基类扩展2

|Util.java

/**

*@author metaphy

* create 2005-4-14 9:06:56

*说明:

*/

(1)Base.java抽象基类只是一个定义

public abstract class Base{

}

(2)Son1.java/Son2.java是已经实现的JavaBean

public class Son1 extends Base{

private int id;

private String name;

public int getId(){

return id;

}

public void setId(int id){

this.id= id;

}

public String getName(){

return name;

}

public void setName(String name){

this.name= name;

}

public void son1Method(String s){

System.out.println(s);

}

}

(3)

public class Son2 extends Base{

private int id;

private double salary;

public int getId(){

return id;

}

public void setId(int id){

this.id= id;

}

public double getSalary(){

return salary;

}

public void setSalary(double salary){

this.salary= salary;

}

}

(4)Util.java演示了如何根据指定的类名,类字段名和所对应的数据,得到一个类的实例

import java.lang.reflect.Method;

public class Util{

//此方法的最大好处是没有类名Son1,Son2可以通过参数来指定,程序里面根本不用出现

public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){

Base base= null;

try{

Class cls= Class.forName(beanName);

base=(Base)cls.newInstance();

Class[] paraTypes= new Class[]{String.class};

Method method= cls.getMethod(fieldSetter, paraTypes);

String[] paraValues= new String[]{paraValue};

method.invoke(base, paraValues);

} catch(Throwable e){

System.err.println(e);

}

return base;

}

public static void main(String[] args){

Son1 son1=(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha");

System.out.println("son1.getName():"+son1.getName());

}

}

//调用结果:

//son1.getName():wang da sha

谢谢!希望能给大家一点启发!

--------------------

附:

//下面这篇文档来源于Internet,作者不详

Reflection是 Java程序开发语言的特征之一,它允许运行中的 Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java类中各成员的名称并显示出来。

Java的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C或者 C++中就没有办法在程序中获得函数定义相关的信息。

JavaBean是 reflection的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection动态的载入并取得 Java组件(类)的属性。

1.一个简单的例子

考虑下面这个简单的例子,让我们看看 reflection是如何工作的。

import java.lang.reflect.*;

public class DumpMethods{

public static void main(String args[]){

try{

Class c= Class.forName(args[0]);

Method m[]= c.getDeclaredMethods();

for(int i= 0; i< m.length; i++)

System.out.println(m[i].toString());

} catch(Throwable e){

System.err.println(e);

}

}

}

按如下语句执行:

java DumpMethods java.util.Stack

它的结果输出为:

public java.lang.Object java.util.Stack.push(java.lang.Object)

public synchronized java.lang.Object java.util.Stack.pop()

public synchronized java.lang.Object java.util.Stack.peek()

public boolean java.util.Stack.empty()

public synchronized int java.util.Stack.search(java.lang.Object)

这样就列出了java.util.Stack类的各方法名以及它们的限制符和返回类型。

这个程序使用 Class.forName载入指定的类,然后调用 getDeclaredMethods来获取这个类中定义了的方法列表。java.lang.reflect.Methods是用来描述某个类中单个方法的一个类。

2.开始使用 Reflection

用于 reflection的类,如 Method,可以在 java.lang.relfect包中找到。使用这些类的时候必须要遵循三个步骤:第一步是获得你想操作的类的 java.lang.Class对象。在运行中的 Java程序中,用 java.lang.Class类来描述类和接口等。

下面就是获得一个 Class对象的方法之一:

Class c= Class.forName("java.lang.String");

这条语句得到一个 String类的类对象。还有另一种方法,如下面的语句:

Class c= int.class;

或者

Class c= Integer.TYPE;

它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类(如 Integer)中预先定义好的 TYPE字段。

第二步是调用诸如 getDeclaredMethods的方法,以取得该类中定义的所有方法的列表。

一旦取得这个信息,就可以进行第三步了——使用 reflection API来操作这些信息,如下面这段代码:

Class c= Class.forName("java.lang.String");

Method m[]= c.getDeclaredMethods();

System.out.println(m[0].toString());

它将以文本方式打印出 String中定义的第一个方法的原型。

在下面的例子中,这三个步骤将为使用 reflection处理特殊应用程序提供例证。

模拟 instanceof操作符

得到类信息之后,通常下一个步骤就是解决关于 Class对象的一些基本的问题。例如,Class.isInstance方法可以用于模拟 instanceof操作符:

class A{

}

public class instance1{

public static void main(String args[]){

try{

Class cls= Class.forName("A");

boolean b1= cls.isInstance(new Integer(37));

System.out.println(b1);

boolean b2= cls.isInstance(new A());

System.out.println(b2);

} catch(Throwable e){

System.err.println(e);

}

}

}

在这个例子中创建了一个 A类的 Class对象,然后检查一些对象是否是 A的实例。Integer(37)不是,但 new A()是。

3.找出类的方法

找出一个类中定义了些什么方法,这是一个非常有价值也非常基础的 reflection用法。下面的代码就实现了这一用法:

import java.lang.reflect.*;

public class method1{

private int f1(Object p, int x) throws NullPointerException{

if(p== null)

throw new NullPointerException();

return x;

}

public static void main(String args[]){

try{

Class cls= Class.forName("method1");

Method methlist[]= cls.getDeclaredMethods();

for(int i= 0; i< methlist.length; i++){

Method m= methlist[i];

System.out.println("name="+ m.getName());

System.out.println("decl class="+ m.getDeclaringClass());

Class pvec[]= m.getParameterTypes();

for(int j= 0; j< pvec.length; j++)

System.out.println("param#"+ j+""+ pvec[j]);

Class evec[]= m.getExceptionTypes();

for(int j= 0; j< evec.length; j++)

System.out.println("exc#"+ j+""+ evec[j]);

System.out.println("return type="+ m.getReturnType());

System.out.println("-----");

}

} catch(Throwable e){

System.err.println(e);

}

}

}

这个程序首先取得 method1类的描述,然后调用 getDeclaredMethods来获取一系列的 Method对象,它们分别描述了定义在类中的每一个方法,包括 public方法、protected方法、package方法和 private方法等。如果你在程序中使用 getMethods来代替 getDeclaredMethods,你还能获得继承来的各个方法的信息。

取得了 Method对象列表之后,要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型,都可以由描述类的对象按顺序给出。

输出的结果如下:

name= f1

decl class= class method1

param#0 class java.lang.Object

param#1 int

exc#0 class java.lang.NullPointerException

return type= int

-----

name= main

decl class= class method1

param#0 class [Ljava.lang.String;

return type= void

-----

4.获取构造器信息

获取类构造器的用法与上述获取方法的用法类似,如:

import java.lang.reflect.*;

public class constructor1{

public constructor1(){

}

protected constructor1(int i, double d){

}

public static void main(String args[]){

try{

Class cls= Class.forName("constructor1");

Constructor ctorlist[]= cls.getDeclaredConstructors();

for(int i= 0; i< ctorlist.length; i++){

Constructor ct= ctorlist[i];

System.out.println("name="+ ct.getName());

System.out.println("decl class="+ ct.getDeclaringClass());

Class pvec[]= ct.getParameterTypes();

for(int j= 0; j< pvec.length; j++)

System.out.println("param#"+ j+""+ pvec[j]);

Class evec[]= ct.getExceptionTypes();

for(int j= 0; j< evec.length; j++)

System.out.println("exc#"+ j+""+ evec[j]);

System.out.println("-----");

}

} catch(Throwable e){

System.err.println(e);

}

}

}

这个例子中没能获得返回类型的相关信息,那是因为构造器没有返回类型。

这个程序运行的结果是:

name= constructor1

decl class= class constructor1

-----

name= constructor1

decl class= class constructor1

param#0 int

param#1 double

-----

5.获取类的字段(域)

找出一个类中定义了哪些数据字段也是可能的,下面的代码就在干这个事情:

import java.lang.reflect.*;

public class field1{

private double d;

public static final int i= 37;

String s="testing";

public static void main(String args[]){

try{

Class cls= Class.forName("field1");

Field fieldlist[]= cls.getDeclaredFields();

for(int i= 0; i< fieldlist.length; i++){

Field fld= fieldlist[i];

System.out.println("name="+ fld.getName());

System.out.println("decl class="+ fld.getDeclaringClass());

System.out.println("type="+ fld.getType());

int mod= fld.getModifiers();

System.out.println("modifiers="+ Modifier.toString(mod));

System.out.println("-----");

}

} catch(Throwable e){

System.err.println(e);

}

}

}

这个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier,它也是一个 reflection类,用来描述字段成员的修饰语,如“private int”。这些修饰语自身由整数描述,而且使用 Modifier.toString来返回以“官方”顺序排列的字符串描述(如“static”在“final”之前)。这个程序的输出是:

name= d

decl class= class field1

type= double

modifiers= private

-----

name= i

decl class= class field1

type= int

modifiers= public static final

-----

name= s

decl class= class field1

type= class java.lang.String

modifiers=

-----

和获取方法的情况一下,获取字段的时候也可以只取得在当前类中申明了的字段信息(getDeclaredFields),或者也可以取得父类中定义的字段(getFields)。

6.根据方法的名称来执行方法

文本到这里,所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection来做一些其它的事情,比如执行一个指定了名称的方法。下面的示例演示了这一操作:

import java.lang.reflect.*;

public class method2{

public int add(int a, int b){

return a+ b;

}

public static void main(String args[]){

try{

Class cls= Class.forName("method2");

Class partypes[]= new Class[2];

partypes[0]= Integer.TYPE;

partypes[1]= Integer.TYPE;

Method meth= cls.getMethod("add", partypes);

method2 methobj= new method2();

Object arglist[]= new Object[2];

arglist[0]= new Integer(37);

arglist[1]= new Integer(47);

Object retobj= meth.invoke(methobj, arglist);

Integer retval=(Integer) retobj;

System.out.println(retval.intvalue());

} catch(Throwable e){

System.err.println(e);

}

}

}

假如一个程序在执行的某处的时候才知道需要执行某个方法,这个方法的名称是在程序的运行过程中指定的(例如,JavaBean开发环境中就会做这样的事),那么上面的程序演示了如何做到。

上例中,getMethod用于查找一个具有两个整型参数且名为 add的方法。找到该方法并创建了相应的 Method对象之后,在正确的对象实例中执行它。执行该方法的时候,需要提供一个参数列表,这在上例中是分别包装了整数 37和 47的两个 Integer对象。执行方法的返回的同样是一个 Integer对象,它封装了返回值 84。

7.创建新的对象

对于构造器,则不能像执行方法那样进行,因为执行一个构造器就意味着创建了一个新的对象(准确的说,创建一个对象的过程包括分配内存和构造对象)。所以,与上例最相似的例子如下:

import java.lang.reflect.*;

public class constructor2{

public constructor2(){

}

public constructor2(int a, int b){

System.out.println("a="+ a+" b="+ b);

}

public static void main(String args[]){

try{

Class cls= Class.forName("constructor2");

Class partypes[]= new Class[2];

partypes[0]= Integer.TYPE;

partypes[1]= Integer.TYPE;

Constructor ct= cls.getConstructor(partypes);

Object arglist[]= new Object[2];

arglist[0]= new Integer(37);

arglist[1]= new Integer(47);

Object retobj= ct.newInstance(arglist);

} catch(Throwable e){

System.err.println(e);

}

}

}

根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。

8.改变字段(域)的值

reflection的还有一个用处就是改变对象数据字段的值。reflection可以从正在运行的程序中根据名称找到对象的字段并改变它,下面的例子可以说明这一点:

import java.lang.reflect.*;

public class field2{

public double d;

public static void main(String args[]){

try{

Class cls= Class.forName("field2");

Field fld= cls.getField("d");

field2 f2obj= new field2();

System.out.println("d="+ f2obj.d);

fld.setDouble(f2obj, 12.34);

System.out.println("d="+ f2obj.d);

} catch(Throwable e){

System.err.println(e);

}

}

}

这个例子中,字段 d的值被变为了 12.34。

9.使用数组

本文介绍的 reflection的最后一种用法是创建的操作数组。数组在 Java语言中是一种特殊的类类型,一个数组的引用可以赋给 Object引用。观察下面的例子看看数组是怎么工作的:

import java.lang.reflect.*;

public class array1{

public static void main(String args[]){

try{

Class cls= Class.forName("java.lang.String");

Object arr= Array.newInstance(cls, 10);

Array.set(arr, 5,"this is a test");

String s=(String) Array.get(arr, 5);

System.out.println(s);

} catch(Throwable e){

System.err.println(e);

}

}

}

例中创建了 10个单位长度的 String数组,为第 5个位置的字符串赋了值,最后将这个字符串从数组中取得并打印了出来。

下面这段代码提供了一个更复杂的例子:

import java.lang.reflect.*;

public class array2{

public static void main(String args[]){

int dims[]= new int[]{5, 10, 15};

Object arr= Array.newInstance(Integer.TYPE, dims);

Object arrobj= Array.get(arr, 3);

Class cls= arrobj.getClass().getComponentType();

System.out.println(cls);

arrobj= Array.get(arrobj, 5);

Array.setInt(arrobj, 10, 37);

int arrcast[][][]=(int[][][]) arr;

System.out.println(arrcast[3][5][10]);

}

}

例中创建了一个 5 x 10 x 15的整型数组,并为处于 [3][5][10]的元素赋了值为 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get之后,arrobj是一个 10 x 15的数组。进而取得其中的一个元素,即长度为 15的数组,并使用 Array.setInt为它的第 10个元素赋值。

注意创建数组时的类型是动态的,在编译时并不知道其类型。

java中的反射机制是什么,有什么作用啊

Method类中的方法的使用(含代码和注释):

getMethods()获得本类及父类中的public权限修饰**符方法

getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法

getDeclaredMethod(Stringname,class<?>...parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表.class

getParameterCount()得到方法的参数个数123456

packageLessonForReflection03;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;abstractclassCard{

privatevoidcreatRandomNumbers(intcount)//private关键字

{

}

publicvoidgetFullCardsNumbers(String[]random,Stringpre_numbers)

{

}

publicstaticvoidgetUserInfor()

{

}

publicabstractvoidgetUserInfor(Stringtel);

publicabstractvoidgetUserInfor(intsal1,intsal2)throwsArrayIndexOutOfBoundsException,ArithmeticException;}publicclassMethodInforGetter{

publicstaticvoidmain(String[]args)

{

Class<?>c1=Card.class;

System.out.println("-------------------------");

Method[]m1=c1.getMethods();//getMethods()获得本类及父类中的public方法!

for(Methodm:m1)

{

System.out.println(m);

}

System.out.println("-------------------------");

Method[]m2=c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!

for(Methodm:m2)

{

System.out.println(m);

}

System.out.println("-------------------------");

/*

*getDeclaredMethod(Stringname,class<?>...parameterTypes)

*第一个参数:方法的名称

*第二个参数:可变长度,写你要查找的那个方法的参数类型列表

*

*getParameterCount()得到方法的参数个数

*/

try

{

Methodm3=c1.getDeclaredMethod("getUserInfor");

System.out.println(m3);

//getParameterCount()方法,获得方法参数个数

System.out.println(m3.getParameterCount());

System.out.println(Modifier.toString(m3.getModifiers()));//获得方法修饰符

System.out.println(m3.getReturnType());

System.out.println("-------------------------");

Methodm4=c1.getDeclaredMethod("getUserInfor",int.class,int.class);

//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型

Class<?>[]exception=m4.getExceptionTypes();

for(Class<?>e:exception)

{

System.out.println(e);

}

}catch(NoSuchMethodException|SecurityExceptione)

{

e.printStackTrace();

}

}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788

Constructor类中的方法的使用www.xiaoyuani.com(含代码和注释):

java.lang.reflect.Constructor:

Constructor[]getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!

Constructor[]getDeclaredConstructor()获得本类中的所以构造函数!

Constructor<T>getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的

Constructor<T>getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法

附:

JDK8.0之后新增的类:

Executable:

它是Method和Constructor的父类

常用方法:

getParameter()获得类中方法参数

getExceptionTypes()获得类中某个方法抛出异常类型

getMoidfiers()获得方法权限修饰符

Parameter:

封装并代表了参数实例123456789101112131415

packageLessonForReflection03;importjava.lang.reflect.Constructor;importjava.lang.reflect.Modifier;importjava.lang.reflect.Parameter;/*

*java.lang.reflect.Constructor

*

*Constructor[]getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的

*Constructor[]getDeclaredConstructor();得本类里的全部构造

*

*Constructor<T>getConstructor(Class...parameterType);用参数决定获得哪个构造方法

*Constructor<T>getDeclaredConstructor(Class...parameterType);

*

*/publicclassConstructorInforGetter{

publicstaticvoidmain(String[]args)

{

System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[]getConstructor()");

System.out.println("子类继承不了父类中的构造方法和private");

//Constructor[]getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的

//子类继承不了父类中的构造方法和private

Class<Circle>c1=Circle.class;

Constructor<?>[]cons1=c1.getConstructors();

for(Constructor<?>cons:cons1)

{

System.out.println(cons);

//System.out.println(cons.getName());

}

System.out.println("-----------------------");

System.out.println("方法获得本类中的所有构造函数getDeclaredConstructor()");

Constructor<?>[]cons2=c1.getDeclaredConstructors();

for(Constructor<?>cons:cons2)

{

System.out.println(cons);

}

System.out.println("-----------------------");

try

{

System.out.println("方法用参数指定获得本类!构造方法,只能获取public的Constructor<T>getConstructor(Class...parameterType)");

Constructor<?>cons3=c1.getConstructor(int.class);

System.out.println(Modifier.toString(cons3.getModifiers()));

System.out.println(cons3);

System.out.println("-----------------------");

System.out.println("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得Constructor<T>getDeclaredConstructor(Class...parameterType)");

Constructor<?>cons4=c1.getDeclaredConstructor(String.class);

System.out.println(cons4);

System.out.println("-----------------------");

/*

*JDK8.0之后新增的类

*Executable:

*是Method和Constructor的父类

*方法:

*getParameter();

*getExceptionTypes();

*getModifiers();

*getTypeParameters();

*

*Parameter:

*封装并代表了参数实例

*/

System.out.println("获取类中方法的参数getParameters()");

Constructor<?>cons5=c1.getDeclaredConstructor(int.class,String.class);

Parameter[]p1=cons5.getParameters();

for(Parameterp:p1)

{

System.out.println(p);

}

}catch(NoSuchMethodException|SecurityExceptione)

{

e.printStackTrace();

}

}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687

代码中提到的Circle类和Shape类二者为继承关系:

packageLessonForReflection03;publicclassCircleextendsShape{

privateintr;

privateStringcolor;

publicCircle(intr,Stringcolor)

{

super();

this.r=r;

this.color=color;

}

publicCircle(intr)

{

super();

this.r=r;

}

protectedCircle(Stringcolor)

{

super();

this.color=color;

}

Circle()

{

super();

}}12345678910111213141516171819202122232425262728293031

packageLessonForReflection03;publicclassShape{

privateintper;

publicShape(intper)

{

super();

this.per=per;

}

publicShape()

{

super();

}}1234567891011121314151617

部分文字来源于:

咕嘟咖啡杨海滨老师—《java编程语言高级特性》

轻量化研习Java相关技术倡导者

“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富

文章到此结束,希望我们对于java反射机制的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。

站长工具seo(SEO站长进行网站运营时常用哪些工具)域名备案批量查询,如何批量查询域名如何批量查询域名是否备案