
运行结果如下:
反射还可以获取private修饰的属性和方法,在反射面前类就像没有穿衣服一样。
当然,凡事有利就有弊,然后我们再来说一下java反射的优缺点;
优点:
1:能够运行时动态获取类的实例,大大提高了系统的灵活性和扩展性;
2:与java动态编译相结合,可以实现无比强大的功能。
缺点:
1:使用反射的性能较低;
2:使用反射来说相对不安全;
3:破坏了类的封装性,可以通过反射来获取这个类的属性,和私有方法。
A:1、Java的private修饰符不是为了绝对安全设计的,而是对用户常规使用Java的一种约束。就好比饭店厨房门口挂着“闲人免进”的牌子,但是你还是能够通过其他方法进去。
2、从外部对对象进行常规调用时,能够看到清晰的类结构
反射么 就是根据你的类来为你创建对象
动态就是灵活的,直接写好的不能变的就是静态的
反射一般配合泛型使用
ClassforName(className)newInstance()
你传入什么类 就能对应生成这个类的对象
先通过IO,定位到这个包
通过Filelist得到一个包含这个包下所有class的文件的数组。
循环这个数组,用包名拼接每一个遍历出来的文件的名字,得到每一个完整的类名(即,包名加类名)
通过classforname反射得到每一个类实例
没太理解你要求的 实现但一般这种动态获取类信息 在java中都是通知反射机制实现的
Java的反射API(Reflection API)Class类:要正确使用Java反射机制就得使用javalangClass这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个
Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。
反射API用于反应在当前Java虚拟机中的类、接口或者对象信息
功能:(Object object = new Object(),下面以对象object进行说明)
1) 获取类的Class对象
如果在运行时一个类的实例已经得到,你可以使用
Class c = 对象名getClass();例: Class c = objectgetClass();Class s = objectgetSuperclass();
如果你在编译期知道类的名字,你可以使用如下的方法Class c =java awt Buttonclass; 或者Class c = IntegerTYPE;
如果类名在编译期不知道, 但是在运行期可以获得, 你可以使用下面的方法Class c = ClassforName(“类的全路径”);
2) 获取类的Fields ,对Field进行赋值
Field[] fus = objectgetClass()getDeclaredField();
Field fu = objectgetClass()getDeclaredField(fieldName);//获取对象object的名称为fieldName的属性域。
fusetAccessible(true) ;//设置属性域的访问属性
fuset(object,val); //设置object对象的属性值
3) 获取类的Method
Method[] ms= objectgetClass()getDeclaredMethods()
4) 获取类的Constructor
5) 新建类的实例
(A)通过Class<T>的函数newInstance
(B)通过Constructor对象的方法newInstance
以上就是关于通过反射修改不可变的String类全部的内容,包括:通过反射修改不可变的String类、java中,为什么说反射是动态的生成实例动态的调用、java如何通过反射获取包中所有的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)