概念和作用
概念
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,生成Class对象和类对象
对于任意一个对象,都能够调用它的任意一个方法和属性
这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制
作用
动态获取类的信息,进一步实现需要的功能
相关API
Class 类型
Constructor 构造方法
Method 方法
Field 属性
除了Class外,其他类都位于java.lang.reflect包中
反射API将类的类型、方法、属性都封装成了类
Class类
Class类的对象表示正在运行的Java应用程序中的类和接口
获得Class的三种方法
/*
反射机制获得类的信息,并创建对象
要使用Class类的方法,必须先获得Class类的实例,获得Class类 实例的常用方法有如下三个
*/
Class clazz1 = new User().getClass();//Object类中的getClass方法
Class clazz2 = new User().getClass();
System.out.println(clazz1==clazz2);//true
Class clazz3 = User.class;//类名.class方式
System.out.println(clazz1==clazz3);
Class clazz4 = Class.forName("mybatisdemo.reflectdemo.User");//Class类的静态方法
System.out.println(clazz3==clazz4);
Constructor类
Constructor类可以通过getXXX方法获得构造方法的基本信息
Constructor实例通过Class实例获得(newInstance())
//获得到了类的Class对象 new 反序列化 反射
Class c = Class.forName("mybatisdemo.reflectdemo.User");
//创建一个对象
Object obj = c.newInstance();
//获取构造方法
Constructor constructor = c.getConstructor();
Object obj1 = constructor.newInstance();//无参
Constructor constructor1 = c.getConstructor(int.class,String.class);//获得的是公共的
constructor1.newInstance(10,"jim");//有参
c.getDeclaredConstructor();//可以获得指定私有的构造方法
Field类
Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值
获得Field实例,都是通过Class中的方法实现
//获得到了类的Class对象 new 反序列化 反射
// Class c = Class.forName("com.ffyc.mybatisdemo.reflectdemo.User");
//创建一个对象
//Object obj = new User(100,"jim11");
Object obj = new Car();
Class objCLass = obj.getClass();
// Field idf = objCLass.getDeclaredField("id");
//idf.setAccessible(true); 设置可以对私有属性操作,不建议,打破封装性
// idf.set(obj,100);
// System.out.println(idf.getName());
Field [] fields = objCLass.getDeclaredFields();//获得所有属性(包含私有)
String s = "{";
for (Field f : fields){
//f.getName()获得属性名, f.getType()属性类型
if(f.getName().equals("id")){
f.set(obj,005);
}
if(f.getName().equals("name")){
f.set(obj,极客);
}
s+="}";
System.out.println(s);
System.out.println(obj);
Method类
Method类将类中的方法进行封装,可以动态获得方法的信息
getName:获得方法名字
getParameterTypes:获得方法参数类型,把参数封装到一个对象中去
除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法
invoke(Object obj, Object… args) :使用obj调用该方法,参数
为args
Method实例都是通过Class类的方法获得
Method getMethod(String name, Class… parameterTypes) :通过指定方法名,参数类型,返回一个 Method实例
//获得到了类的Class对象 new 反序列化 反射
// Class c = Class.forName("com.ffyc.mybatisdemo.reflectdemo.User");
//创建一个对象
//Object obj = new User(100,"jim11");
Object obj = new Car();
Class objCLass = obj.getClass();
// Field idf = objCLass.getDeclaredField("id");
//idf.setAccessible(true); 设置可以对私有属性操作,不建议,打破封装性
// idf.set(obj,100);
// System.out.println(idf.getName());
Field [] fields = objCLass.getDeclaredFields();//获得所有属性(包含私有)
String s = "{";
for (Field f : fields){
// f.getName()获得属性名, f.getType()属性类型
//获得执行名称的方法
Method m = objCLass.getMethod("get"+String.valueOf(f.getName().charAt(0)).toUpperCase()+f.getName().substring(1)) ;
s+=f.getName()+":"+m.invoke(obj)+",";//invoke(obj) 执行获取到的obj对象中的方法
// Method m = objCLass.getMethod("set"+String.valueOf(f.getName().charAt(0)).toUpperCase()+f.getName().substring(1),f.getType()) ;
//动态获得属性的get方法
}
s+="}";
System.out.println(s);
System.out.println(obj);