编程语言
首页 > 编程语言> > Java反射

Java反射

作者:互联网

目录

 

一、什么是反射

二、Class

三、如何得到 Class 对象

3.1、最常用的方式: 可以利用 Class 类的静态方法: forName(className) 

3.2、如果已经存在对应的对象, 则可以调用其 getClass() 方法

3.3、可以直接利用 类 的 class 静态属性: 该种方式不会使静态代码块执行. 

3.4、Class 对象的作用

四、如何使用反射调用构造方法

4.1、无参构造

4.2、无参构造

4.3、有参构造

五、如何使用反射调用方法

六、如何使用反射调用属性


一、什么是反射

反射其实是获取类的字节码文件,也就是.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:张三

 

anhao78 发布了12 篇原创文章 · 获赞 0 · 访问量 126 私信 关注

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