反射

反射机制-->框架的实现
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;
    }   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值