反射 - 图1

Class

  1. public class ClassTest {
  2. public static void main(String[] args) {
  3. System.out.println(String.class.getName());
  4. System.out.println(String.class.getSimpleName());
  5. System.out.println(String.class.getPackage().getName());
  6. System.out.println(String.class.isInterface());
  7. System.out.println(String.class.isEnum());
  8. System.out.println(String.class.isPrimitive());
  9. }
  10. }

访问字段

读取字段名

// 通过类拿到字段名
System.out.println(Student.class.getField("name"));
Field name = Student.class.getField("name");
Field age = Student.class.getDeclaredField("age");
System.out.println(name.getName());
System.out.println(age.getName());

通过实例拿到字段值

 // 通过实例拿到字段值
Object stu = new Student("xiaoming",19);
age.setAccessible(true); //  因为  age 是 private 的,所以必须设置这个参数
System.out.println(age.get(stu)); // 19

通过实例设置字段值

// 通过实例设置字段值
age.set(stu,20);
System.out.println(((Student) stu).getAge()); // 20

调用方法

首先定义一个类:

class Student extends People {
    public String name;
    private int age;
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public static String getNameAndAge(){
        return "Hello this is testing";
    }
}

调用普通方法

// 调用方法
Method m = Student.class.getMethod("setAge", int.class);
m.invoke(stu,99);
System.out.println(((Student) stu).getAge()); // 99

调用静态方法

// 调用静态方法
// 无需指定实例,所以实例部分的参数,可以设置为 null
Method staticMethod = Student.class.getMethod("getNameAndAge");
String str = (String) staticMethod.invoke(null);
System.out.println(str); // Hello this is testing

多态

反射也遵循多态的原则

// 多态
Method p = People.class.getMethod("hello");
p.invoke(new Student("xx",12)); // Student:hello

调用构造函数

 try{
     Constructor con = Teacher.class.getConstructor(String.class, int.class);
     Teacher t = (Teacher) con.newInstance("xiaoming",100);
     t.hello(); 
 }catch (NoSuchMethodException e){

 }catch (Exception e){

 }

动态代理

public class ProxyTest {
    public static void main(String[] args) {
        // 在这里实现了 接口 方法
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method);
                if(method.getName().equals("morning")){
                    System.out.println("Good Morning " + args[0]);
                }
                return null;
            }
        };
        // 在这里直接创建实例
        Hello hello = (Hello) Proxy.newProxyInstance(
                Hello.class.getClassLoader(),
                new Class[]{Hello.class},
                invocationHandler
        );

        // 使用方法
        hello.morning("Bob");
    }
};

interface Hello{
    void morning(String name);
}

代码

https://github.com/01x01/Java/blob/master/src/ReflectTest.java

Java Basic