java 反射 class

1,什么是反射?

  反射可以理解为对类的分析。 利用反射,我们可以在运行时分析类,查看类的对象

2,如何实现反射?

那就不得说与反射最为相关的类-----java.lang.Class类

比如: Person类的实例,是具体对象,xiaozhang,xiaowang,bendan

    Class类的实例,就是内存中类的字节码  ----》一个类被类加载器加载到内存,占据一部分存储空间,空间里的内容就是类的字节码,不同类的字节码文件是不同的。这一个个空间可以用对象来表示。这些对象对应的类就是Class类


3. 如何得到字节码对应的对象?

其实也是实现反射的最常用语句:

 对于类----》类名.class  --》  Person.class

对于对象----》 对象.getClass() ----> new Date().getClass()

通过类名---》Class.forName("类名")----->Class.forName(“java,lang,String");


4.都什么样的类型可以应用反射?

或者可以问:什么样的数据类型有Class的实例对象?

只要在源程序中出现的数据类型都有Class的实例对象。int,double这样的基本数据类型有其预定义的Class实例对象, int.Class ==Integer.TYPE


5. 反射有什么用?

一个类的所有成员(方法,属性...)都可以用相应的反射API类(Class类,Constructor,Field,Method。。。。)的一个实例对象来表示。得到这些实例对象,就是反射的作用。我们要知道的是,得到这些实例对象有什么用 ?怎么用 ?

Constructor类------ 类的构造方法

得到类的所有构造方法:

Constructor [] Constructors =  Class.forName("java,lang,String").getConstructors();

得到某一个构造方法:

Constructor constructor = Class.forName("java,lang,String").getConstructor("StringBuffer.class")

其余方法可通过API了解。


Field类----类的属性(或者叫类的成员变量)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用反射来获取对象并操作属性。下面是一个示例代码,演示了如何使用反射来获取类的实例并操作其属性: ```java import java.lang.reflect.Field; public class ReflectionExample { public static void main(String[] args) { // 创建一个对象 MyClass obj = new MyClass(); // 获取对象的类 Class<?> objClass = obj.getClass(); try { // 获取属性 Field field = objClass.getDeclaredField("myField"); // 打开访问权限 field.setAccessible(true); // 获取属性的值 Object value = field.get(obj); System.out.println("原始值:" + value); // 设置属性的值 field.set(obj, "新的值"); // 再次获取属性的值 value = field.get(obj); System.out.println("修改后的值:" + value); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } class MyClass { private String myField = "初始值"; } ``` 在上面的示例代码中,我们首先创建了一个 MyClass 的对象 obj。然后通过 obj.getClass() 方法获取了 obj 对象的类,即 MyClass 类的 Class 对象 objClass。接下来,使用 objClass.getDeclaredField("myField") 方法获取了名为 myField 的私有字段。为了能够访问私有字段,我们通过 field.setAccessible(true) 打开了访问权限。然后,通过 field.get(obj) 方法获取了 myField 的原始值,并打印输出。接着,使用 field.set(obj, "新的值") 方法设置了 myField 的新值。最后,再次使用 field.get(obj) 方法获取 myField 的新值,并打印输出。 需要注意的是,反射操作可能会影响代码的性能和可读性,因此应该谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值