登录 or

反射(高级框架中都会用到)

通用处理各个表
封装(参数)使便利化查询各个表
 
—————反射(高级框架中都会用到)
 
反射理解:宫斗剧中有A.B两位贵妃,B贵妃嫉妒A弄了个巫蛊之术的小人,每天扎A小人,A受到影响病痛难忍
 
如图Class的形成过程
class.png

 
 
现在要自己手动用Class对象获取成员变量和构造方法等
 
1.创建reflect包,包下创建CreateClassObject
 
package com.guaguauu.reflect;
 
import com.guaguauu.entity.Emp;
 
public class CreateClassObject {
    public static void main(String args) throws ClassNotFoundException {
        //三种方式创建class
        // 1.通过Class.forname()来获取Class对象
//        Class clazz = Class.forName("com.guaguauu.entity.Emp");
        //2.通过类名.class来获取
//        Class clazz = Emp.class;
        //3.通过对象的getClass()来获取,第三种不推荐,最好用第一和二种
        Class clazz = new Emp().getClass();
        System.out.println(clazz.getPackage());
        System.out.println(clazz.getName());
        System.out.println(clazz.getSimpleName());
        System.out.println(clazz.getCanonicalName());
        //如果是一个基本数据类型,可以通过.TYPE的方式来获取Class对象
//        Class<Integer> type = Integer.TYPE;
        Class type = Integer.class;
        System.out.println(type.getName());//返回当前打印对象
        System.out.println(type.getCanonicalName());//返回类名
    }
}
 
2.getFields和getDeclaredFields的区别
//获取属性值(成员变量),包括子类及父类,同时只包含公共的方法
        Field fields = clazz.getFields();
 
//此方法返回的是当前类的所有属性,不仅仅局限于公共访问修饰符,任何访问修饰符都可以拿到。
        Field declaredFields = clazz.getDeclaredFields();
 
 
 
3.newInstance()调用无参构造方法,所以以后注意写子类是要写上无参构造方法。此处是
public Student() {
        super();
    }
 
 
package com.guaguauu.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ClassAPI {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.guaguauu.reflect.Student");
//获取属性值(成员变量),包括子类及父类,同时只包含公共的方法
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field);
System.out.println(field.getName());
System.out.println(field.getType());
//获取访问修饰符modifier,常量值,public是1
System.out.println(field.getModifiers());
System.out.println("---------");
}
System.out.println("=============");
//此方法返回的是当前类的所有属性,不仅仅局限于公共访问修饰符,任何访问修饰符都可以拿到。
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName());
}

System.out.println("======================");
//反射在一定程度上破坏了封装性,需要合理使用
Field address = clazz.getDeclaredField("address");
//设置该属性能否被访问,true表示能被访问,破坏了封装性
address.setAccessible(true);
System.out.println(address.getName());
Object o = clazz.newInstance();
address.set(o,"北京市");
System.out.println(((Student)o).getAddress());
System.out.println("==================");
//获取该对象的普通方法,包含的方法范围为当前对象及父类对象的所有公共方法
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}

System.out.println("------------------------");
//获取当前类中的所有方法,无论什么访问修饰符
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName());
}
//如何使用当前类的方法,使用add方法
Method add = clazz.getDeclaredMethod("add", int.class, int.class);
//允许访问add方法
add.setAccessible(true);
Object o1 = clazz.newInstance();
add.invoke(o1,123,123);
System.out.println("===================");
//获取对象的公有构造方法
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName());
}
System.out.println("------------");
//获取对象的所有的构造方法
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor.getName());
}
//如何调用私有的构造方法
Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
declaredConstructor.setAccessible(true);
//newInstance工厂模式
Object o2 = (Student)declaredConstructor.newInstance("guagua", 11, "java");
System.out.println(o2);


}

}

 

 

 
已邀请:

要回复问题请先登录注册