Java反射
作者:互联网
目录
3.1、最常用的方式: 可以利用 Class 类的静态方法: forName(className)
3.2、如果已经存在对应的对象, 则可以调用其 getClass() 方法
3.3、可以直接利用 类 的 class 静态属性: 该种方式不会使静态代码块执行.
一、什么是反射
反射其实是获取类的字节码文件,也就是.class文件。反射是学习 Java 框架的基础. Java 框架的底层实现都是基于反射
二、Class
1、 Class 是一个类型.
2、当一个 .class 文件被加载到 JVM 时, 在 JVM 内部会创建唯一的一个 Class 对象, 它对应 .class 文件。
三、如何得到 Class 对象
3.1、最常用的方式: 可以利用 Class 类的静态方法: forName(className)
String className = "com.atguigu.reflection.Person";
clazz = Class.forName(className);
3.2、如果已经存在对应的对象, 则可以调用其 getClass() 方法
Object object = new Person();
clazz = object.getClass();
3.3、可以直接利用 类 的 class 静态属性: 该种方式不会使静态代码块执行.
clazz = Person.class;
3.4、Class 对象的作用
Class 是反射的核心, 一切反射都是从 Class 开始的
四、如何使用反射调用构造方法
4.1、无参构造
Class<?> aClass = Class.forName("com.example.reflection.Person");
//调用无参构造
Object o = aClass.newInstance();
System.out.println(o);
//this is 无参构造 person()
//Person{name='tempName', age=18}
4.2、无参构造
Class<?> aClass = Class.forName("com.example.reflection.Person");
//调用无参构造
Constructor<?> constructor = aClass.getConstructor();
var o = constructor.newInstance();
System.out.println(o);
//this is 无参构造 person()
//Person{name='tempName', age=18}
4.3、有参构造
Class<?> aClass = Class.forName("com.example.reflection.Person");
// 调用有参构造
Constructor<?> constructor = aClass.getConstructor(String.class);
Object o3 = constructor.newInstance("张三");
System.out.println(o3);
//this is 有参构造 person(name)
//Person{name='张三', age=18}
五、如何使用反射调用方法
Class<?> aClass = Class.forName("com.example.reflection.Person");
Object o = aClass.newInstance();
//获取到public方法
Method method = aClass.getMethod("setName", String.class);
System.out.println(o);//Person{name='tempName', age=18}
//调用public方法
Object name = method.invoke(o,"zs");
System.out.println(o);//Person{name='zs', age=18}
//获取到private方法
Method method2 = aClass.getDeclaredMethod("privateMethod");
//使方法能够被调用
method2.setAccessible(true);
//调用方法
Object name2 = method2.invoke(o);
System.out.println(name2);
六、如何使用反射调用属性
Class<?> aClass = Class.forName("com.example.reflection.Person");
Object o = aClass.newInstance();
Field field = aClass.getField("age");
Object age = field.get(o);
System.out.println("public 属性age:" + age);//public 属性age:18
field.set(o, 28);
Object age2 = field.get(o);
System.out.println("变更后的public 属性age:" + age2);//变更后的public 属性age:28
Field field2 = aClass.getDeclaredField("name");
field2.setAccessible(true);
Object name = field2.get(o);
System.out.println("private 属性name:" + name);//private 属性name:tempName
field2.set(o, "张三");
Object name2 = field2.get(o);
System.out.println("变更后的private 属性name:" + name2);//变更后的private 属性name:张三

标签:aClass,Java,name,反射,age,Object,Person,Class 来源: https://blog.csdn.net/weixin_42215490/article/details/103362757