Java反射的基本应用——代码详解

Java反射的基本应用——代码详解


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class ReflectTest2 {

    public static void main(String[] args)
            throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException,
            IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {

        /************** 获取Class的三种方法 **************/


        // first way Access
        Access access = new Access();
        Class c1 = access.getClass();
        // second way
        Class c2 = Access.class;
        // third way
        Class c3 = Class.forName("***.***.***.Access");//带完整包名

        // 获取类的反射 反射得到的类型为Class
        Class c = Access.class;
        // 实例化Class c
        Object o = c.newInstance();


        /************** 获取对象的属性(field) **************/


        // --- 获取对象中一个名为pub_name的属性(此方式只可访问由public修饰的)
        Field field = c.getField("pub_name");

        // 获取属性的名字
        System.out.println(field.getName());
        // 获取属性的修饰符
        System.out.println(field.getModifiers());
        // 获取属性类型
        System.out.println(field.getType());
        // 获取属性值
        System.out.println(field.get(o));

        // --- 获取对象中全部的public修饰的属性

        Field[] fields = c.getFields();
        // 通过增强for遍历输出
        for (Field f1 : fields) {
            System.out.println(f1);
        }

        // --- 获取对象中所有访问权限的属性

        Field field2 = c.getDeclaredField("pro_name");
        System.out.println(field2.isAccessible());
        System.out.println(field2.getName());
        System.out.println(field2.getModifiers());
        // 获取属性值时 需要通过setAccessible()取消对Java访问控制的检查
        field2.setAccessible(true);
        // 所有get(Object o)带参的方法均有Java访问控制检查
        System.out.println(field2.get(o));

        // --- 获取对象中全部的所有访问权限的属性

        Field[] fields2 = c.getDeclaredFields();
        // 通过增强for遍历输出
        for (Field f2 : fields2) {
            System.out.println(f2);
        }


        /************** 获取对象的方法 (method) **************/


        // --- 调用public修饰的无参的方法
        Method method = c.getMethod("run");
        method.invoke(o);

        // --- 调用public修饰的有参的方法
        // first way
        Method method2 = c.getMethod("say", String.class, int.class);
        method2.invoke(o, "hello", 18);
        // second way
        Method method3 = c.getMethod("say", new Class[] { String.class, int.class });
        method3.invoke(o, new Object[] { "Hello", 18 });

        // --- 调用所有修饰符修饰的方法

        // see方法是由protected修饰符修饰的 因为本类与Access属于同包,因此public protected
        // defult修饰的方法可以直接访问
        Method method4 = c.getDeclaredMethod("see");
        method4.invoke(o);
        // private方法是由private修饰符修饰的
        // 因为本类没有对Access的private的访问权限,因此需要通过方法取消Java语言访问控制的检查
        Method method5 = c.getDeclaredMethod("talk");
        method5.setAccessible(true);
        method5.invoke(o);

        // --- 返回全部的方法
        Method[] methods = c.getMethods();
        for (Method m1 : methods) {
            System.out.println(m1);
        }

        // --- 返回全部的方法 不包含父类的
        Method[] methods2 = c.getDeclaredMethods();
        for (Method m2 : methods2) {
            System.out.println(m2);
        }


        /*********** 获取对象的构造器 (Constructor) ***********/


        // --- 调用无参的构造器
        Constructor con1 = c.getConstructor();
        // 用构造器创造对象实例
        Object o2 = con1.newInstance();

        // --- 调用有参的构造器
        Constructor con2 = c.getConstructor(new Class[] { String.class });
        Object o3 = con2.newInstance(new Object[] { "tom" });

        // --- 调用private修饰的(所有修饰符修饰的)构造器
        // Access(int prameter)是private修饰符修饰的构造器
        // 因为本类没有对Access的private的访问权限,因此需要通过方法取消Java语言访问控制的检查
        Constructor con3 = c.getDeclaredConstructor(new Class[] { int.class });
        con3.setAccessible(true);
        Object o4 = con3.newInstance(new Object[] { 1 });

        // --- 返回全部的构造器
        Constructor[] cons = c.getDeclaredConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }

    }

}



public class Access {
    public  String pub_name="pub";

    String def_name="def";

    protected String pro_name="pro";

    private String pri_name="pri";

    public Access() {
        System.out.println("this is no praameter constructor !");
    }

    public Access(String pub_name) {
        System.out.println("this is has praameter constructor !");
    }   

    private Access(int pri_name){
        System.out.println("this is private constructor !");
    }

    public void run(){
        System.out.println("Access..run...");
    }
    public void say(String msg,int age){
        System.out.println("Say--"+msg+"--"+age);
    }
    protected void see(){
        System.out.println("Access..pro...see");
    }
    private void talk(){
        System.out.println("Access..pri...talk");
    }

    public String getPub_name() {
        return pub_name;
    }
    public void setPub_name(String pub_name) {
        this.pub_name = pub_name;
    }
    public String getDef_name() {
        return def_name;
    }
    public void setDef_name(String def_name) {
        this.def_name = def_name;
    }
    public String getPro_name() {
        return pro_name;
    }
    public void setPro_name(String pro_name) {
        this.pro_name = pro_name;
    }
    public String getPri_name() {
        return pri_name;
    }
    public void setPri_name(String pri_name) {
        this.pri_name = pri_name;
    }
    @Override
    public String toString() {
        return "Access [pub_name=" + pub_name + ", def_name=" + def_name + ", pro_name=" + pro_name + ", pri_name="
                + pri_name + "]";
    }

}

猜你喜欢

转载自blog.csdn.net/circlely/article/details/78291772
今日推荐