1、java反射机制就是在运行状态下,对任意一个类,都能知道所有的属性和方法。
对于任意一个对象,都能调用其任意一个方法和属性。这种动态获取信息以及动态调用对象的方法的功能叫做java反射机制。
1.1 获取字节码对象的三种方式
(1)Object类中的getClass()方法:使用该中方式,必须要有具体的类,并且要创建对象(比较麻烦)
Thing t = new Thing();
Class clazz = t.getClass();
(2)任何数据类型都具备一个静态属性.class来获取对应的Class对象
Class clazz = Thing.class;
(3)只要通过给定的类类 的字符串名称就可以获取该类,更为扩展。要用Class类中的方法完成,该方法就是forName
Class clazz = Class.forName(包名+类名);
2、反射机制获取Class中的构造函数
String className = "com.jash.bean.Person";
//找寻该名称类文件,并加载进内存,并产生Class对象
Class clazz = Class.forName(classname);
//获取Person类的构造函数Person("jack",18);
clazz.getConstructor(String.class,int.calss);
//产生该类的对象并对其进行初始化
Object o = clazz.newInstance("jack",18);
3、反射机制获取Class中的属性
Class clazz = Class.forName("com.jash.bean.Person");
Field field = clazz.getField("age");//只能获取公有的
field = clazz.getDeclaredField("age");//只获取本类,但包含私有。
//对私有字段的访问取消权限检查。暴力访问。
fiel.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj,89);//设置obj对象中属性age的值为89
Object o = field.get(obj);//获取obj对象中的属性age的值
System.out.println(o);
3、反射机制获取Class中的公共函数(方法)
(1)获取所有方法
Class clazz = Class.forName("com.jsah.bean.Person");
Method[ ] methods = clazz.getMethods();//获取的都是公有的方法,1
methods = calzz.getDeclaredMethods();//获取本类中所有的方法,包含私有,2
for(Method method : methods){
System.out.println(method);
}
(2)获取指定的一般方法(无参的)
Class clazz = Class.forName("com.jsah.bean.Person");
Method method = clazz.getMethod("show“,null);//获取空参数的一般方法
//Object obj = clazz.newInstance();//创建一个实例(方法一)
Constructor constructor = clazz.getConstructor(String.calss,int.class);
Object obj = constructor.newInstance("小明",37);//创建一个实例(方法二)
method.invoke(obj,null);//obj是本类的对象,因为show方法中没有传入参数,所以为空。
(3)获取指定的有参方法
Class clazz = Class.forName("com.jsah.bean.Person");
Method method = clazz.getMethod("paramMethod“,String.class,int.class);//获取参数类型为String和int 的paramMethod方法
Object obj = obj.newInstance();method.invoke(obj,"小明",39);