一:什么是反射?
反射库提供了一个精心设计的工具集,以便编写能够动态操纵java代码的程序;能够分析类能力的程序称为反射。
二:反射可以干什么?
- 在运行时分析类的能力
- 在运行时查看对象
- 实现通用的数组操纵代码
- 使用Method对象
三:Class类
在程序运行期间,java会追踪每一个对象所属的类,并获取,保存这个类的所有信息,保存这些信息的类被叫做Class;
Class类实际上是一个泛型类,
四:如何获取反射对象?
- 类.class
Class<TestBean> clazz=javaBean.class;
- 对象.getClass()
Class clazz=javabean.getClass();
- Class.forName(包名+类名)
Class clazz=Class.forName("com.cxt.vo.javaBean");
五:通过反射分析类的能力
- 获取类的名字
String className=clazz.getSimpleName();//通过反射对象获取类名
- 获取目标对象
Object obj=clazz.newInstance(); //等效于 new javaBean();
- 获取属性的类型和名字
Field[] fields= clazz.getFields();//只获取公共的属性
Field[] fields=clazz.getDeclaredFields();//获取所有的属性
for(Field field:fields){
//获取属性名
String name=field.getName();
//获取属性类型
Class fieldClazz=field.getType();
}
- 操作单个属性:可以给属性(包括私有属性,需要取消该属性的安全性监测)存值,取值(要求原来的类有set,get方法)
public static void testField(){
try {
Class clazz=TestBean.class;
Object obj=clazz.newInstance();
/*Field phone=clazz.getField("phone");
//存值 对象.setPhone("138888888");
phone.set(obj, "138888888");//obj.setPhone("111111");
//取值 对象.getPhone();
Object phoneVal=phone.get(obj);
System.out.println(phoneVal);*/
/*Field mail=clazz.getField("mail");
//类.属性名=值
mail.set(null, "123456@qq.com");
//类.属性名
Object mailVal=mail.get(null);
System.out.println(mailVal);*/
Field id=clazz.getDeclaredField("id");//获取私有属性
//取消java的底层安全性监测
id.setAccessible(true);
id.set(obj, 9527);//给私有属性存值,取值,需要取消java的底层安全性检测
Object idVal=id.get(obj);
id.setAccessible(false);
System.out.println(idVal);
} catch (Exception e) {
e.printStackTrace();
}
}
- 操作方法
- 获取所有方法及其方法名
/**
* 通过反射模板获取多个方法
*/
public static void testMethods(){
//获取反射模板
Class clazz=TestBean.class;
//获取自己及超类所有公共的方法集合
//Method[] methods=clazz.getMethods();
//获取所有的方法集合
Method[] methods=clazz.getDeclaredMethods();
System.out.println(methods.length);
for(Method method:methods){
//获取方法名
String methodName=method.getName();
System.out.println(methodName);
}
}
2.执行方法:方法对象.invoke()
/**
* 通过反射模板获取单个方法
*/
public static void testMethod(){
try {
Class clazz=TestBean.class;
Object obj=clazz.newInstance();
// Method test=clazz.getMethod("test");
//执行方法
//对象.方法名(实参列表)
//方法对象.invoke()
// test.invoke(obj);
// Method hello=clazz.getMethod("hello", String.class);
// hello.invoke(null, "周星驰");
Method add=clazz.getDeclaredMethod("add",int.class,int.class);
add.setAccessible(true);
Object result=add.invoke(obj, 333,333);
add.setAccessible(false);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
- 获取所有构造器
/**
* 通过反射模板获取多个构造器
*/
public static void testConstructors(){
Class clazz=TestBean.class;
// Constructor[] cons=clazz.getConstructors();
Constructor[] cons=clazz.getDeclaredConstructors();
System.out.println(cons.length);
}
- 获取单个构造器,通过构造器创建对象实例
/**
* 通过反射模板获取单个构造器
*/
public static void testConstructor(){
try {
Class clazz=TestBean.class;
//Constructor<TestBean> con=clazz.getConstructor();
//通过构造器创建对象实例
// TestBean bean=con.newInstance();// clazz.newInstance new TestBean()
// System.out.println(bean);
// Constructor<TestBean> con=clazz.getConstructor(int.class,String.class);
// TestBean bean=con.newInstance(666,"周润发");
// System.out.println(bean);
Constructor<TestBean> con=clazz.getDeclaredConstructor(String.class,int.class);
con.setAccessible(true);
TestBean bean=con.newInstance("啊啊啊",18);
con.setAccessible(false);
System.out.println(bean);
} catch (Exception e) {
e.printStackTrace();
}
}