java反射机制:
java反射机制是在运行状态中,对于任意一个类(class 文件),都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用他的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
动态获取类中的信息,就是java反射。可以理解为对类的解剖
用于描述字节码文件的类 class Class{ },这个类中提供了获取字节码文件中内容的方法
要想对字节码文件进行解剖,必须要有字节码文件
如何获取字节码文件对象,有三种方式:
1、Object类中的getClass( )方法的。
想要用这种方式,必须要明确具体的类,并创建对象,麻烦
例如:Person p = new Person( ); Class clazz = p.getClass;
2、任何数据类型都具备一个静态的属性。class来获取其对应的class对象
相对简单,但是还是要明确到类中的静态成员,还是不够扩展
Class clazz =Person.class();
3(重点)、只要通过给定的类的字符串名称就可以获取该类,更为扩展
可以用Class类中的方法完成,该方法就是forName
这种方式只要有名称就可以,更为方便,扩展性更强
String className =“cn.itcast.bean.Person”;注意:要有完整的包名
Class clazz = Class.forName(className);
(1)、获取构造函数
newInstance();创建此class对象所表示的类的一个新实例
一般被反射的类都带有空参的构造函数,没有空参构造函数时要怎么做呢?
getConstructors(可变参数);获得类中的公共构造函数,只能是公共的
例如:Constructor constructor = clazz.getConstructors(String.class,int.class);
//通过该构造器的newInstance方法进行对象的初始化
Object obj = constructor.newInstance("小明",38);
getDeclaredConstructors获取类中所有的构造函数,包括私有构造函数,但只是本类中的
(2)、获取字段
Field field = clazz.getDeclaredField("age");
//对私有字段的访问取消权限检查.暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj,89);
Object o = field.get(obj);
(3)、获取方法
Methods [] methods = clazz.getMethods();//获取所有的公共方法
methods = clazz.DeclaredgetMethods();
for(Method method:method){
System.out.println(method);
}
Method method = clazz.getMethod("show",null);//获取一个空参数的函数名为show的方法,第二个参 数是可变参数
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小明",38);
mehtod.invoke(obj,null);
java反射机制是在运行状态中,对于任意一个类(class 文件),都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用他的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
动态获取类中的信息,就是java反射。可以理解为对类的解剖
用于描述字节码文件的类 class Class{ },这个类中提供了获取字节码文件中内容的方法
要想对字节码文件进行解剖,必须要有字节码文件
如何获取字节码文件对象,有三种方式:
1、Object类中的getClass( )方法的。
想要用这种方式,必须要明确具体的类,并创建对象,麻烦
例如:Person p = new Person( ); Class clazz = p.getClass;
2、任何数据类型都具备一个静态的属性。class来获取其对应的class对象
相对简单,但是还是要明确到类中的静态成员,还是不够扩展
Class clazz =Person.class();
3(重点)、只要通过给定的类的字符串名称就可以获取该类,更为扩展
可以用Class类中的方法完成,该方法就是forName
这种方式只要有名称就可以,更为方便,扩展性更强
String className =“cn.itcast.bean.Person”;注意:要有完整的包名
Class clazz = Class.forName(className);
(1)、获取构造函数
newInstance();创建此class对象所表示的类的一个新实例
一般被反射的类都带有空参的构造函数,没有空参构造函数时要怎么做呢?
getConstructors(可变参数);获得类中的公共构造函数,只能是公共的
例如:Constructor constructor = clazz.getConstructors(String.class,int.class);
//通过该构造器的newInstance方法进行对象的初始化
Object obj = constructor.newInstance("小明",38);
getDeclaredConstructors获取类中所有的构造函数,包括私有构造函数,但只是本类中的
(2)、获取字段
Field field = clazz.getDeclaredField("age");
//对私有字段的访问取消权限检查.暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj,89);
Object o = field.get(obj);
(3)、获取方法
Methods [] methods = clazz.getMethods();//获取所有的公共方法
methods = clazz.DeclaredgetMethods();
for(Method method:method){
System.out.println(method);
}
Method method = clazz.getMethod("show",null);//获取一个空参数的函数名为show的方法,第二个参 数是可变参数
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小明",38);
mehtod.invoke(obj,null);