Java_反射的基本应用

反射是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性
和方法;对于任意一个对象,都只能都调用它的任意一个方法和属性,
反射其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件
封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。
就是把JAVA类中的各种成分反射成为相应的JAVA类简单说:反射技术可以对一个
类进行解剖。这种动态获取的信息一级动态调用对象的方法的功能
称为java 的反射机制。
简单说:反射技术可以对一个类进行解剖.

反射可以实例化对象,获得类的属性、方法、和构造函数;
访问属性、调用方法、调用构造函数创建对象;
要想获得类中不同的信息,需要不同的途径;
--------------------------------------------------------------------------------------------------------------------------
但首先都要获得类的字节码文件,有三种模式:
1.通过类名获得
class clazz = 类名.class
2.通过已存在的实例对象获得
clazz.getclass();
3.通过完整的类名
class.forName("完整的类名(带包名)");
获得不同信息
-------------------------------------------------------------------------------------------------------------------------
实例化对象
String name = "完整的类名(带包名)";
    寻找该名称类文件,并加载到内存,产生class对象
Class clazz = Class.forName(name);
   产生该类对象
Object obj = clazz.newInstance();
   得到指定构造方法
 Constructor  constructor= Class.forName("").getConstructor(String.class);
创建实例对象
 Object obj=constructor.newInstance("abc");//这里穿件了一个字符串“abc”

获得构造方法
得到类中所有构造方法
Constructor  constructors[]= Class.forName("").getConstructors();
得到某一个构造方法
已获得类的字节码文件获得构造函数
Constructor  constructor= Class.getConstructor(StringBuffer);
已获得字节码文件创建实例
String str=(String) constructor.newInstance(new StringBUffer("abc"));
未获得字节码文件获得构造函数
Constructor  constructor= Class.forName("").getConstructor(StringBuffer.class);
Class.newInstance()方法:
String obj=(String)Class.forName("java.lang.String").newInstance();
先得到默认的构造方法,然后用该构造方法创建实例对象。

获得成员变量
public类成员变量
类名 p = new 类名(变量值);
Field y = 类名.getClass().getField("变量名");
y.get(p);//取出变量值
private类成员变量
类名 p = new 类名(变量值);
Field y = 类名.getClass().getDeclaredField("变量名");//获取对象不管是私有还是被保护的
y.steAccessible(true);//暴力反射
y.get(p);//取出变量值

获得成员方法
Method  methodCharAt = String.class.getMethod("charAt"--方法名,int.class--这是参数类型,如果是空参函数则是 null);
    Object obj=clazz.newInstance();

     methodCharAt.invoke(str1,1);
  
  数组的反射
Class clazz=obj.getClass();
     if(clazz.isArray()){
     int len=array.getLength(obj);
     for(int i=0;i<len;i++){
             sopArray.get(obj,i))
      }   
  }
    
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以获得成员变量为例,修改成员变量的值
import java.lang.reflect.*;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
ReflectPoint pt1 = new ReflectPoint(4,3);//创建ReflectPoint供反射使用

Field filedy=pt1.getClass().getField("y");//获得类中具体的成员变量的方法
filedy.get(pt1);//取出Y的值
System.out.println(pt1.y);

        changeStringValue(pt1);
        System.out.println(pt1);
    }

    private static void changeStringValue(Object obj) throws Exception {
        Field[] fields = obj.getClass().getFields();//获得类中所有的成员变量,在方法体内,没有制定的类和实例,用Object代替
        for(Field field : fields){ //循环类中的变量
            if(field.getType() == String.class){   //找到对应的变量名
                String oldValue = (String)field.get(obj);//获得变量值存储在String变量中
                String newValue = oldValue.replace('b', 'a'); //调用String的replace方法替换制定字母
                field.set(obj,newValue);
            }
        }
    }
}

class ReflectPoint {
    private int x;
    public int y;
    public ReflectPoint(int x, int y) {//构造函数
        super();
        this.x = x;
        this.y = y;
    }

public String str1 = "ball";
    public String str2 = "basketball";
    public String str3 = "itcast";
    public String toString() {  //覆盖toString方法
        return str1+":"+str2+":"+str3;
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值