Java(30):反射

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

public class ReflectionDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        
        Class studentClass = Class.forName("Student");
        System.out.println("studentClass = "+studentClass);
        
        System.out.println("所有构造方法:");
        Constructor[] constructors = studentClass.getDeclaredConstructors();
        for (Constructor c : constructors) {
            System.out.println(c);
        }
        
        System.out.println("所有公有public构造方法:");
        constructors = studentClass.getConstructors();
        for (Constructor c : constructors) {
            System.out.println(c);
        }
    
        System.out.println("获取无参的构造方法:");
        Constructor constructor = studentClass.getDeclaredConstructor(null);
        System.out.println(constructor);
        
        System.out.println("获取带string、int、string参数的构造方法,并使用:");
        constructor = studentClass.getDeclaredConstructor(String.class, int.class, String.class);
        System.out.println(constructor);
        
//        该构造方法是private,通过setAccessible(true)忽略访问修饰符
        constructor.setAccessible(true);
        Object obj = constructor.newInstance("张三", 18, "male");
        
    }

}

class Student {
    
    public Student() {
        System.out.println("public,无参数构造方法...");
    }
    
    protected Student(String name) {
        System.out.println("protected,带string参数构造方法.. student名字是:"+name);
    }
    
    Student(String name, int age) {
        System.out.println("默认,带string、int参数构造方法.. student名字是:"+name+",年龄是:"+age);
    }
    
    private Student(String name, int age, String sex) {
        System.out.println("private,带string、int、string参数构造方法.. student名字是:"+name+",年龄是:"+age+",性别是:"+sex);
    }
    
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class FieldDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {
        
        Class personClass = Class.forName("Person");
        System.out.println(personClass);
        
        System.out.println("获取所有字段:");
        Field[] fields = personClass.getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f);
        }
        
        System.out.println("获取所有公有public字段:");
        fields = personClass.getFields();
        for (Field f : fields) {
            System.out.println(f);
        }
        
        System.out.println("获取某一字段,并调用:");
        Field field = personClass.getDeclaredField("sex");
        System.out.println(field);
        
//        Constructor constructor = personClass.getDeclaredConstructor(null);
//        Object person = constructor.newInstance();
        Object person = personClass.getDeclaredConstructor(null).newInstance();
        field.set(person, "male");
        
        System.out.println(person);
        
        System.out.println("获取私有private字段,并调用:");
        field = personClass.getDeclaredField("phoneNumber");
        
        field.setAccessible(true);
        field.set(person, "13xxxxxxxxx");
    
        System.out.println(person);
    
    }
    
    
}

class Person {
    
    public String name;
    protected int age;
    String sex;
    private String phoneNumber;
    
    public Person() {
        //empty
    }
    
    @Override
    public String toString() {
        return "Person [name = " + name + ", age = " + age + ", sex = " + sex + ", phoneNumber = " + phoneNumber + "]";
    }
}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        
        Class teacherClass = Class.forName("Teacher");
        System.out.println(teacherClass);
        
        System.out.println("获取所有方法:");
        Method[] methods = teacherClass.getDeclaredMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
        
        System.out.println("获取所有公有public方法:");
        methods = teacherClass.getMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
        
        System.out.println("获取某一方法:");
        Method method = teacherClass.getDeclaredMethod("show1", String.class);
        System.out.println(method);
        Object object = teacherClass.getDeclaredConstructor(null).newInstance();
        method.invoke(object, "jack");
        
        method = teacherClass.getDeclaredMethod("show4", int.class);
        System.out.println(method);
//        解除私有private限定
        method.setAccessible(true);
        String str = (String) method.invoke(object, 20);
        System.out.println(str);
        
    }
    
}

class Teacher {
    public void show1(String name) {
        System.out.println("public, name = " + name);
    }
    
    void show2(String name, int age) {
        System.out.println("default, name = ");
    }
    
    protected void show3() {
        System.out.println("protected, empty param");
    }
    
    private String show4(int age) {
        System.out.println("private, age = " + age);
        return "abc";
    }
}

参考:https://blog.csdn.net/a745233700/article/details/82893076

原文地址:https://www.cnblogs.com/kenantongxue/p/14108459.html