反射
1. 获取Class三种方式
- Class.forName()
- 对象.getClass()
- 类型.class
public static void main(String[] args) {
/*
* 1. forName是一个静态方法
* 2. 参数是一个字符串
* 3. 参数必须是一个完整类名
* 4. 此方法会导致类加载,执行且只执行静态代码块中的内容
*/
Class c1 = Class.forName("java.lang.String");
/*
* 所有对象都有一个getClass()方法:可以和获取字节码文件
*/
String s= "";
Class c2 = s.getClass();
/*
* Java中所有的数据类型都有 .class 属性:用来获取字节码文件
*/
Class c3 = String.class;
/*
* 获取类的名字
*/
String name = Student.getName(); //获取全类名:com.Ming.Student
String simpleName = Student.getSimpleName(); //获取类名:Student
}
2. Field类
-
获取FIled
https://www.bilibili.com/video/BV1Rx411876f?p=823&t=7.6
public static void main(String[] args) throws ClassNotFoundException { Class Student = Class.forName("com.Ming.Student"); //获取Field Field[] fields = Student.getFields(); //获取修饰符为public的Field Field[] declaredFields = Student.getDeclaredFields(); //获取全部Field for (Field declaredField : declaredFields) { String name = declaredField.getName(); //获取属性名 Class type = declaredField.getType(); //获取属性类型 int i = declaredField.getModifiers(); //获取修饰符列表,返回值为int,每个数字对应一组修饰符列表 String s = Modifier.toString(i); } }
-
访问对象属性
https://www.bilibili.com/video/BV1Rx411876f?p=825&t=105.7
public static void main(String[] args){ Class Student = Class.forName("com.Ming.Student"); Object student = Student.newInstance(); Field fieldName = Student.getDeclaredField("name"); //获取Field fieldName.set(student,"Ming"); //设置对象student的 属性fieldName的 值Ming fieldName.get(student); //获取对象student的 属性fieldName的值 }
3. Method类
https://www.bilibili.com/video/BV1Rx411876f?p=828&t=3.0
public static void main(String[] args) throws Exception {
Class Student = Class.forName("com.Ming.Student");
Object student = Student.newInstance();
Method sum = Student.getDeclaredMethod("sum", int.class, int.class); //根据方法名,形参 获取Method
Object invoke = sum.invoke(student, 3, 4); //方法名.invoke(对象,形参列表)
}
4. Constructor类
https://www.bilibili.com/video/BV1Rx411876f?p=831&t=179.7
5. 获取父类,父接口
https://www.bilibili.com/video/BV1Rx411876f?p=833&t=26.0
6. 资源绑定器
/*
* 资源绑定器
* 1. 只能绑定properties文件,且放在类路径下
* 2. 路径的扩展名不能写
*/
ResourceBundle bundle = ResourceBundle.getBundle("classInfo");
String className = bundle.getString("className");
7. 类加载器
jDK中自带三种类加载器,使用了双亲委派机制
- 启动类加载器(父)
- 扩展类加载器(母)
- 应用类加载器(加载calsspath中的jar包)