69期-Java SE-024-反射-2-001-002

### 反射应用

通过反射机制调用方法

```java
package com.southwind.test;

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

import com.southwind.entity.Student;

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setId(1L);
        student.setName("张三");
        student.show();
        
        Class clazz = student.getClass();
        try {
            Method method = clazz.getMethod("setId", Long.class);
            method.invoke(student, 2L);
            method = clazz.getMethod("setName", String.class);
            method.invoke(student, "李四");
            method = clazz.getMethod("show", null);
            method.invoke(student, null);
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```



通过反射机制访问成员变量

```java
package com.southwind.test;

import java.lang.reflect.Field;

import com.southwind.entity.Student;

public class Test2 {
    public static void main(String[] args) {
        Class clazz = Student.class;
        //获取目标类本身以及父类的所有public成员变量
//        Field[] fields = clazz.getFields();
//        for(Field field:fields) {
//            System.out.println(field);
//        }
//        System.out.println("********************");
        Student student = new Student();
        student.setId(1L);
        student.setName("张三");
        //获取目标类本身的全部成员变量
        Field[] fields = clazz.getDeclaredFields();
        for(Field field:fields) {
//            try {
//                System.out.println(field.get(student));
//            } catch (IllegalArgumentException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            } catch (IllegalAccessException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
            field.setAccessible(true);
            if(field.getName().equals("id")) {
                try {
                    field.set(student, 2L);
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else {
                try {
                    field.set(student, "李四");
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            try {
                System.out.println(field.get(student));
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("成员变量名称:"+field.getName());
            System.out.println("成员变量数据类型:"+field.getType().getName());
            System.out.println("访问权限:"+getModifiers(field.getModifiers()));
        }
        
        System.out.println(student.getId());
        System.out.println(student.getName());
//        System.out.println("*********************");
//        try {
//            Field field = clazz.getField("id");
//            System.out.println(field);
//        } catch (NoSuchFieldException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        } catch (SecurityException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
//        System.out.println("************************");
//        try {
//            Field field = clazz.getDeclaredField("id");
//            System.out.println(field);
//        } catch (NoSuchFieldException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        } catch (SecurityException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }
    
    public static String getModifiers(int modifier) {
        String result = "";
        switch(modifier) {
        case 0:
            result = "";
            break;
        case 1:
            result = "public";
            break;
        case 2:
            result = "private";
            break;
        case 3:
            result = "protected";
            break;
        }
        return result;
    }
}
```



通过反射机制调用构造函数

```java
package com.southwind.test;

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

import com.southwind.entity.Student;

public class Test3 {
    public static void main(String[] args) {
        Class clazz = Student.class;
        Constructor<Student> constructor = null;
        try {
//            constructor = clazz.getConstructor(null);
            constructor = clazz.getConstructor(Long.class,String.class);
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//        System.out.println(constructor);
        try {
            Student student = constructor.newInstance(3L,"小明");
            System.out.println(student);
            Student student1 = new Student();
            System.out.println(student1);
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```



### 动态代理

代理模式,它是一种常用的 Java 设计模式,指的是软件设计所遵循的一套理论和准则。

在处理某个业务逻辑时,通过代理的方式来完成。

委托方、代理方

委托方和代理方有一个共性,即双方都具备完成需求的能力。

Java中将对象所具备的能力封装成接口,委托方和代理方需要实现同一个接口。

代理对象可以为委托对象进行消息预处理,过滤消息以及事后处理消息等。

代理类和委托类之间存在注入的关联关系。

我们在访问委托对象时,是通过代理对象来间接访问的,代理模式就是通过这种间接访问的方式,为程序预留出可处理的空间,利用此空间,在不影响核心业务的基础上可以附加其他的业务,这就是代理模式的优势。



代理模式又可以分为静态代理和动态代理,两者的区别在于静态代理需要预先编写好代理类的代码,在编译期间代理类的 class 文件就已经生成了。

静态代理就是预先写好代理类,动态代理是程序运行期间动态地生成代理类。

People.java

package com.southwind.entity;

public class People {
    public int age;
}

Student.java

package com.southwind.entity;

public class Student extends People {
    private Long id;
    private String name;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public void show() {
        System.out.println("学生信息");
        System.out.println("ID:"+this.id);
        System.out.println("姓名:"+this.name);
    }
    public Student(Long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public Student() {
        super();
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }    
    
}

Apple.java

package com.southwind.proxy;

public class Apple implements Phone {

    @Override
    public String salePhone() {
        // TODO Auto-generated method stub
        return "销售iPhone手机";
    }

}

Benz.java

package com.southwind.proxy;

public class Benz implements Car {

    @Override
    public String saleCar() {
        // TODO Auto-generated method stub
        return "销售奔驰汽车";
    }

}

BMW.java

package com.southwind.proxy;

public class BMW implements Car {

    @Override
    public String saleCar() {
        // TODO Auto-generated method stub
        return "销售宝马汽车";
    }

}

Car.java

package com.southwind.proxy;

public interface Car {
    public String saleCar();
}

CarProxy.java

package com.southwind.proxy;

public class CarProxy implements Car {
    private Car car;
    public CarProxy(Car car) {
        // TODO Auto-generated constructor stub
        this.car = car;
    }

    @Override
    public String saleCar() {
        // TODO Auto-generated method stub
        return this.car.saleCar();
    }

}

Huawei.java

package com.southwind.proxy;

public class HuaWei implements Phone {

    @Override
    public String salePhone() {
        // TODO Auto-generated method stub
        return "销售华为手机";
    }

}

MyProxy.java

package com.southwind.proxy;

public class MyProxy implements Car,Phone{
    private Object obj;
    
    public MyProxy(Object obj) {
        // TODO Auto-generated constructor stub
        this.obj = obj;
    }

    @Override
    public String salePhone() {
        // TODO Auto-generated method stub
        Phone phone = (Phone) obj;
        return phone.salePhone();
    }

    @Override
    public String saleCar() {
        // TODO Auto-generated method stub
        Car car = (Car) obj;
        return car.saleCar();
    }
}

Phone.java

package com.southwind.proxy;

public interface Phone {
    public String salePhone();
}

PhoneProxy.java

package com.southwind.proxy;

public class PhoneProxy implements Phone {
    private Phone phone;
    
    public PhoneProxy(Phone phone) {
        this.phone = phone;
    }
    
    @Override
    public String salePhone() {
        // TODO Auto-generated method stub
        System.out.println("代理模式");
        return this.phone.salePhone();
    }
    
}

Test.java

package com.southwind.proxy;

public class Test {
    public static void main(String[] args) {
        Phone phone = new Apple();
        System.out.println(phone.salePhone());
        phone = new HuaWei();
        System.out.println(phone.salePhone());
    }
}

Test2.java

package com.southwind.proxy;

public class Test2 {
    public static void main(String[] args) {
        Phone phone = new Apple();
        PhoneProxy proxy = new PhoneProxy(phone);
        System.out.println(proxy.salePhone());
        phone = new HuaWei();
        proxy = new PhoneProxy(phone);
        System.out.println(proxy.salePhone());
    }
}

Test.java

package com.southwind.test;

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

import com.southwind.entity.Student;

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setId(1L);
        student.setName("张三");
        student.show();
        
        Class clazz = student.getClass();
        try {
            Method method = clazz.getMethod("setId", Long.class);
            method.invoke(student, 2L);
            method = clazz.getMethod("setName", String.class);
            method.invoke(student, "李四");
            method = clazz.getMethod("show", null);
            method.invoke(student, null);
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Test2.java

package com.southwind.test;

import java.lang.reflect.Field;

import com.southwind.entity.Student;

public class Test2 {
    public static void main(String[] args) {
        Class clazz = Student.class;
        //获取目标类本身以及父类的所有public成员变量
//        Field[] fields = clazz.getFields();
//        for(Field field:fields) {
//            System.out.println(field);
//        }
//        System.out.println("********************");
        Student student = new Student();
        student.setId(1L);
        student.setName("张三");
        //获取目标类本身的全部成员变量
        Field[] fields = clazz.getDeclaredFields();
        for(Field field:fields) {
//            try {
//                System.out.println(field.get(student));
//            } catch (IllegalArgumentException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            } catch (IllegalAccessException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
            field.setAccessible(true);
            if(field.getName().equals("id")) {
                try {
                    field.set(student, 2L);
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else {
                try {
                    field.set(student, "李四");
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            try {
                System.out.println(field.get(student));
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("成员变量名称:"+field.getName());
            System.out.println("成员变量数据类型:"+field.getType().getName());
            System.out.println("访问权限:"+getModifiers(field.getModifiers()));
        }
        
        System.out.println(student.getId());
        System.out.println(student.getName());
//        System.out.println("*********************");
//        try {
//            Field field = clazz.getField("id");
//            System.out.println(field);
//        } catch (NoSuchFieldException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        } catch (SecurityException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
//        System.out.println("************************");
//        try {
//            Field field = clazz.getDeclaredField("id");
//            System.out.println(field);
//        } catch (NoSuchFieldException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        } catch (SecurityException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }
    
    public static String getModifiers(int modifier) {
        String result = "";
        switch(modifier) {
        case 0:
            result = "";
            break;
        case 1:
            result = "public";
            break;
        case 2:
            result = "private";
            break;
        case 3:
            result = "protected";
            break;
        }
        return result;
    }
}

Test3.java

package com.southwind.test;

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

import com.southwind.entity.Student;

public class Test3 {
    public static void main(String[] args) {
        Class clazz = Student.class;
        Constructor<Student> constructor = null;
        try {
//            constructor = clazz.getConstructor(null);
            constructor = clazz.getConstructor(Long.class,String.class);
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//        System.out.println(constructor);
        try {
            Student student = constructor.newInstance(3L,"小明");
            System.out.println(student);
            Student student1 = new Student();
            System.out.println(student1);
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/HiJackykun/p/11173289.html