Java反射一

一 .什么是反射?

class是一切反射的根源JAVA反射机制是在运行状态中,对于任和一个类,通过反射都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

二 .反射的作用:

通过反射访问java对象的属性,方法,构造方法等

三 .得到class类的对象有三种方式:


1.   object类中的getClass()方法

2. 类.class

3. Class.forName("类的包名")

四. 具体功能实现:



 
public class DogBean {
    private String dColor;
    private int dAge;
    private String dSex;
    private String dName;

    public DogBean() {

    }


    public DogBean(String dName) {
        this.dName = dName;
    }

    public DogBean(String dColor, int dAge, String dSex) {
        this.dColor = dColor;
        this.dAge = dAge;
        this.dSex = dSex;
    }

    public DogBean(String dColor, int dAge, String dSex, String dName) {
        this.dColor = dColor;
        this.dAge = dAge;
        this.dSex = dSex;
        this.dName = dName;
    }

    public String getdColor() {
        return dColor;
    }

    public void setdColor(String dColor) {
        this.dColor = dColor;
    }

    public int getdAge() {
        return dAge;
    }

    public void setdAge(int dAge) {
        this.dAge = dAge;
    }

    public String getdSex() {
        return dSex;
    }

    public void setdSex(String dSex) {
        this.dSex = dSex;
    }


    public void getDogName(String name) {
        System.out.print("我的名字叫 : "+dName+ "\n");
    }

private Integer getDogAge(Integer age) {
    return age;
}

 
}



1 .获取类信息:

@Test
public void TestReflex(){
    DogBean dogBean = new DogBean("黑色",2,"男");
    //获取改对象所在的信息
    Class<? extends DogBean> cl = dogBean.getClass();

    Class class2 = DogBean.class;
    
    Class class3 = null;
    try {
        class3 = Class.forName("com.example.administrator.tests.bean.DogBean");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    System.out.print(" 输出cl: "+cl+"\n");
    System.out.print(" 输出cl: "+cl.getName()+"\n");

    System.out.print(" 输出 class2 : "+class2.getName()+"\n");
    
    System.out.print(" 输出 class3 : "+class3.getName()+"\n");
}
输出结果:

输出cl: class com.example.administrator.tests.bean.DogBean
 输出cl: com.example.administrator.tests.bean.DogBean
 输出 class2 : com.example.administrator.tests.bean.DogBean
 输出 class3 : com.example.administrator.tests.bean.DogBean
2.通过类信息创建对象:


/**
 * 创建对象
 */
DogBean class3Oblect = null;
try {
    //调用了DogBean的无参数构造方法,创建新的实例
     class3Oblect = (DogBean)class3.newInstance();
    class3Oblect.setdAge(33);
    class3Oblect.setdSex("男");
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

System.out.print(" 输出 创建对象得到的值  年龄: "+class3Oblect.getdAge()+" 性别:"+class3Oblect.getdSex()+"\n");
输出结果:

输出 创建对象得到的值  年龄: 33 性别:男


五. 获取构造方法:


/**
 * 获取构造方法
 */

Constructor[] class3Constructors = class3.getConstructors();
for (int i = 0; i < class3Constructors.length; i++) {
    System.out.print(" 输出所有构造方法: " + class3Constructors[i] + "\n");
    System.out.print(" 输出所有构造方法name: " + class3Constructors[i].getName() + "\n");
}
输出结果:

输出所有构造方法: public com.example.administrator.tests.bean.DogBean()
 输出所有构造方法name: com.example.administrator.tests.bean.DogBean
 输出所有构造方法: public com.example.administrator.tests.bean.DogBean(java.lang.String,int,java.lang.String)
 输出所有构造方法name: com.example.administrator.tests.bean.DogBean

六.获取属性:


/**
 * 获取所有属性
 */

Field[] class3Fields = class3.getDeclaredFields();
for (int i = 0; i < class3Fields.length; i++) {

    System.out.print(" 获取所有属性: " + class3Fields[i] + "\n");
}
输出结果:

获取所有属性: private java.lang.String com.example.administrator.tests.bean.DogBean.dColor
 获取所有属性: private int com.example.administrator.tests.bean.DogBean.dAge
 获取所有属性: private java.lang.String com.example.administrator.tests.bean.DogBean.dSex


七.获取一个属性Field的值:


try {
    Object c = class3.newInstance();
    Field class3Field = class3.getDeclaredField("dAge");
    //使用反射机制可以打破封装性 一般属性用于private 申明过的属性
    class3Field.setAccessible(true);
    class3Field.set(c,66);

    System.out.print(" 输出属性的值: " + class3Field.get(c) + "\n");
} catch (Exception e) {
    e.printStackTrace();
}


输出结果:



八.  获取方法等也类似获取属性这样的操作:


方法关键字 含义

getDeclaredMethods()/getMethods

获取本类所有的方法(包括私有方法)/获取所有的方法(包括父类的方法)

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,……) 获得特定的方法
   
构造方法关键字  

getDeclaredConstructors()

获取所有的构造方法
getDeclaredConstructor(参数类型.class,……) 获取特定的构造方法
父类和父接口  

getSuperclass()

获取其类的父类

getInterfaces()

获取其类实现的接口
   

后续继续补充.....


猜你喜欢

转载自blog.csdn.net/u014133119/article/details/80501677