获取字节码文件对象的三种方式
1,(常用)源代码阶段,Class.forName("全类名")
2,(传参)加载阶段 类名.class
3,(前提有对象)运行阶段 对象.getClass()
Java反射机制(动态获取类的信息)
框架需要处理任意类,而框架只知道类的地址,就需要对不同的类进行创建对象,方法调用。
框架通过反射机制,在只知道类地址的情况下,就可以操作类。
框架可以通过反射机制在写一套处理程序后,就可以达到以不变应万变。
java的反射机制在运行状态中,可以动态获取任意类的信息,并且可以创建对象,还可以调用任意对象的方法和属性。这种动态获取,调用的机制称java反射机制。(反向使用类)
反向使用类的前提:获取Class字节码对象。
Class类中的方法
constructor.setAccessible(true);//设置指定构造方法为允许访问 暴力反射:表示临时取消权限校验
constructor.getModifiers();//获取构造方法的权限修饰符
adminClass.getConstructor();//获取指定参数个数的公共构造方法(public)
adminClass.getDeclaredConstructor();//获取指定参数个数的所有构造方法(包括私有)
adminClass.getConstructors();//获取所有公共构造方法
adminClass.getDeclaredAnnotations();//获取所有构造方法
adminClass.getFields();//获取所有属性,返回的是一个Field类型的数组
adminClass.getField("gender");//获取公共权限指定名称的属性
adminClass.getDeclaredFields();//获取所有属性
adminClass.getDeclaredField("gender");//获取指定属性名称的属性
adminClass.getMethod("getAds");//获取指定公共方法
adminClass.getMethods();//获取所有公共方法
adminClass.getDeclaredMethod("getAccount");//获取指定方法
adminClass.getDeclaredMethods();//获取所有方法
public class test3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class adminClass = Class.forName("com.ffyc.mybatis.model.Admin");//获取Admin类的Class对象
Constructor constructor=adminClass.getConstructor();//获取类的一个无参构造方法(公共的)
Object obj=constructor.newInstance();//新建一个对象
constructor = adminClass.getDeclaredConstructor(int.class);//获取有一个参数的构造方法(包括私有)
constructor.setAccessible(true);//设置私有的为允许访问
obj = constructor.newInstance(10);//新建一个对象
System.out.println(obj.toString());
System.out.println(adminClass.getDeclaredConstructors().length);//获取所有构造方法(包括私有)
}
}
暴力反射:表示临时取消权限校验。
.setAccessible(true);