黑马程序员--反射

来源:互联网 发布:java redis缓存数据库 编辑:程序博客网 时间:2024/06/06 16:45

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

 

反射:反射就是把Java类中的各个成分映射成相应的Java类,就是可以获得一个类的所有信息。主要包含方法和属性两部分。反射的作用就是用来做框架

什么是暴力反射:java  特性之一就是封装,将对象的属性和具体现实隐藏起来,只对外提供公共访问,private修饰的属性和方法对我们是不可见,我们通过正常的方法是无法

i获取以及修改的,可是通过反射可以强制获取并做一些修改,这就破坏了封装性,这就是所谓的暴力放射

 

反射技术:

其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。

反射的好处:

大大增强了程序的扩展性。


反射的基本步骤:

1、获得Class对象,就是获取到指定名称的字节码文件对象。

2、实例化对象,获得类的属性、方法和构造函数。

3、访问属性、调用方法、调用构造函数创建对象。


获取Class对象,有三种方式:

1、通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。

2、每一个数据类型(基本数据类型和引用数据类型)都有一个静态的Class.弊端:必须要先明确该类。

3、使用Class类中的方法,静态的forName方法。指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符串传入即可。


//1、根据给定的类名来获得,用于类加载

String classname = “cn.itcast.bean.Person”;//来自配置文件

Class clazz = Class.forName(classname);//此对象代表Person.class


//2、如果拿到了对象,不知道是什么类型,用于获得对象的类型。

Object obj = new Person();

Class clazz1 = obj.getClass();//获取对象具体的类型


//3、如果是明确地获得某个类的Class对象,主要用于传参数

Class clazz = Person.class;

代码:

[java] view plaincopyprint?package reflect;  
  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
  
class Reflect   
{     
    public static void main(String[] args)throws Exception   
    {     
        //反射获取构造函数,具体构造函数通过其参数列表确定   
        Constructor<String> constructor=String.class.getConstructor(StringBuffer.class);  
        //通过反射获取的构造函数创建实例化对象   
        String str=(String)constructor.newInstance(new StringBuffer("abc"));  
        System.out.println(str.charAt(2));  
        //新建ReflectPoint类对象,将其成员变量初始化为3,5   
        ReflectPoint p=new ReflectPoint(3,5);  
        //通过反射获取成员变量字节码,此成员变量为私有   
        Field fx=p.getClass().getDeclaredField("x");  
        fx.setAccessible(true);//暴力反射获取私有成员变量字节码   
        //反射获取公有成员变量字节码   
        Field fy=p.getClass().getField("y");  
        System.out.println(fx.get(p));//成员变量的值需要与对象关联才能获取   
        System.out.println(fy.get(p));  
        changeStringValue(p);//调用改变字符串方法   
        System.out.println(p);//将改变后的字符串输出   
        //反射获取成员方法,成员方法通过方法名和其参数列表确定   
        Method method=str.getClass().getMethod("charAt", int.class);  
        //反射调用方法   
        System.out.println(method.invoke(str, 2));  
    }  
    public static void changeStringValue(Object obj) throws Exception  
    {  
        //反射获取所有成员变量   
        Field[] fields=obj.getClass().getFields();  
        //遍历所有成员变量字节码   
        for(Field field:fields)  
        {  
            //判断是否为String.class类型成员变量字节码   
            if(field.getType()==String.class)  
            {  
                //获取成员变量的值   
                String oldValue=(String) field.get(obj);  
                //将字符串中所有的b替换成a   
                String newValue=oldValue.replace('b', 'a');  
                field.set(obj, newValue);  
            }  
        }  
    }  
}  
class ReflectPoint  
{  
    private int x;  
    public int y;  
    public String str1="ball";  
    public String str2="basketball";  
    public String str3="itcast";  
    ReflectPoint(int x,int y)  
    {  
        this.x=x;  
        this.y=y;  
    }  
    public String toString()  
    {  
        return (str1+":"+str2+":"+str3);  
    }  
}  

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

 

0 0
原创粉丝点击