Java动态性之反射机制(reflection)(2)

System.out.println("所有公有构造方法");
    Constructor[] conArry=clas.getConstructors();
    for(int i=0;i<conArry.length;i++) {
        System.out.println(conArry[i]);
    }

System.out.println("所有的构造方法");
    conArry=clas.getDeclaredConstructors();
    for(int i=0;i<conArry.length;i++) {
        System.out.println(conArry[i]);
    }

System.out.println("获取公有无参的构造方法");
    Constructor con=clas.getConstructor(null);
    System.out.println("con="+con);
    Object obj=con.newInstance();

System.out.println("获取私有构造方法,并调用");
    con=clas.getDeclaredConstructor(char.class);
    System.out.println(con);
    //con.setAccessible(true);//暴力访问,针对private方法和字段时使用
    obj=con.newInstance('a');//创建对象
}

}

输出


所有公有构造方法
public first.Student(char)
public first.Student()
public first.Student(java.lang.String,int)
所有的构造方法
protected first.Student(boolean)
private first.Student(int)
public first.Student(char)
public first.Student()
first.Student(java.lang.String)
public first.Student(java.lang.String,int)
获取公有无参的构造方法
con=public first.Student()
调用了公有、无参构造方法执行了。。。
获取私有构造方法,并调用
public first.Student(char)
姓名:a

Fields.java(字段)


package first;

import java.lang.reflect.Field;

public class Fields {

public static void main(String[] args)throws Exception {
    // TODO Auto-generated method stub
    Class StuClass=Class.forName("first.Student");

System.out.println("获取所有公有的字段");
    Field[] fieldArry=StuClass.getFields();
    for(Field f:fieldArry) {
        System.out.println(f);
    }
    System.out.println("获取所有的字段(包括私有、受保护、默认的)");
    fieldArry=StuClass.getDeclaredFields();
    for(Field f:fieldArry) {
        System.out.println(f);
    }
    System.out.println("获取公有字段并调用");
    Field f = StuClass.getField("name");
    System.out.println(f);
    Object obj=StuClass.getConstructor().newInstance();
    StuClass.getConstructor(String.class,int.class).newInstance("a",10);
    f.set(obj, "b");
    Student stu=(Student)obj;
    System.out.println(stu.name);

System.out.println("获取私有字段并调用");
    f = StuClass.getDeclaredField("phoneNum");
    System.out.println(f);
    f.setAccessible(true);//暴力反射,解除私有限定
    f.set(obj, "18888889999");
    System.out.println("验证电话:" + stu);
}

}

输出


获取所有公有的字段
public java.lang.String first.Student.name
获取所有的字段(包括私有、受保护、默认的)
public java.lang.String first.Student.name
protected int first.Student.age
char first.Student.sex
private java.lang.String first.Student.phoneNum
获取公有字段并调用
public java.lang.String first.Student.name
调用了公有、无参构造方法执行了。。。
姓名:a年龄:10
b
获取私有字段并调用
private java.lang.String first.Student.phoneNum
验证电话:Student [name=b, age=0, sex=

Main.java


package first;

import java.lang.reflect.Method;

public class Main {
public static void main(String[] args) {
try {
// 1、获取Student对象的字节码
Class clazz = Class.forName("first.Student");

// 2、获取main方法

Method methodMain = clazz.getMethod("main", String[].class);// 第一个参数:方法名称,第二个参数:方法形参的类型,

// 3、调用main方法
        // methodMain.invoke(null, new String[]{"a","b","c"});
        // 第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组
        // 这里拆的时候将 new String[]{"a","b","c"} 拆成3个对象。。。所以需要将它强转。
        methodMain.invoke(null, (Object) new String[] {});// 方式一
        // methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6acfb1dd334ea68b49a36d8ba20184bb.html