反射机制-->框架的实现
Class类 描述java中 类
可以通过Class类得到指定类的特点,例如:类名 接口 包 父类等
使用到的类都在内存中,这些字节码就是Class对象的实例对象
对象.getClass();
Class.forName("类名");加载类的字节码,同时返回类的实例对象
8个基本类型也有class对象,void也有class 对象
数组类型的实例对象 Class.isArray();
源程序中所有的类 都有Class实例对象
反射
可以提高程序的复用性
Java中所有的方法 参数也都是类
构造方法反射
通过得到Class类的信息就可以得到他的方法的类对象,然后利用对象方法可以应用这个方法
通过指定参数类型选择重载方法中具体的一个
使用对象的newInstance()方法,使用方法,其中如果需要参数再get方法时指定
A类具体对象--getClass-->A类字节码--getConstructor(*重载方法中具体需要的参数类型*)-->方法类的对象(A类的构造方法
中使用前面指定参数类型的一个)--newInstance(*参数对象*!注意类型与前面的相同)*注意如果没有用到泛型时需要强制转换
为相应的类*-->得到新的A类对象
Class类中的newInstance() 为使用无参数构造方法直接创建对象,如:
Class.forName("com.mysql.jdbc.Driver").newInstance();
!反射比较占用缓存,降低程序性能。
变量反射:类似反射会类的字节码中变量的部分,获取值时需要指定对应的实际变量。
方法反射 ——Method类
getMetod(方法名,参数的类)
使用方法invoke(使用方法的对象,参数对象)
调用静态方法对象上传人null;
同类型同纬度数组字节码相同
基本类型不是Object
Array 可以对数组进行反射
对象进行比较时需要重写equals方法
如果对象使用HashCode存储
就会比较对象的HashCode所以HashCode也需要重写
并且注意如果HashCode方法中需要的参数被修改的话HashCode值也会随之修改造成内存泄漏
测试结果:
*********************************************************
abcd
3
5
str1:axc | str2:axcxxxxc | str3:aaaaaac
*********************************************************
代码:
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception{
Point p1 = new Point(5,3);
Constructor cons1 = String.class.getConstructor(StringBuffer.class);
String str1 = (String)cons1.newInstance(new StringBuffer("abcd"));
System.out.println(str1);
//一般的public的变量
Field fy = p1.getClass().getField("y");
System.out.println(fy.get(p1));
//private的需要暴力反射,首先强制获取
Field fx = p1.getClass().getDeclaredField("x");
//强制显示
fx.setAccessible(true);
System.out.println(fx.get(p1));
//?暴力反射会不会降低安全性?
ReString rstr = new ReString();
changeString(rstr);
System.out.println(rstr);
}
public static void changeString(Object obj)throws Exception{
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
if(field.getType() == String.class){ //比较字节码
String oldStr = (String)field.get(obj);
String newStr = oldStr.replace('b', 'x');
field.set(obj, newStr);
}
}
}
}
class Point {
private int x;
public int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class ReString {
String str1 = "abc";
String str2 = "abcbbbbc";
String str3 = "aaaaaac";
@Override
public String toString() {
return "str1:"+str1+" | "+"str2:"+str2+" | "+"str3:"+str3;
}
}
反射
最新推荐文章于 2025-04-22 13:49:06 发布