(一)Class的getSuperclass与getGenericSuperclass区别
getSuperclass 返回直接继承的父类 (没有显示泛型参数)
Class<? super T>**getSuperclass**()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。
getGenericSuperclass 返回直接继承的父类(包含泛型参数)
Type **[getGenericSuperclass]()**()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。
/*** @author heian* @create 2020-07-07-7:48 下午* @description*/public class Test {public static void main(String[] args) {//com.tz.campus.controller.PersonSystem.out.println("Student.class.getSuperclass()\t" + Student.class.getSuperclass());//com.tz.campus.controller.Person<com.tz.campus.controller.Test>System.out.println("Student.class.getGenericSuperclass()\t" + Student.class.getGenericSuperclass());//java.lang.ObjectSystem.out.println("Test.class.getSuperclass()\t" + Test.class.getSuperclass());//java.lang.ObjectSystem.out.println("Test.class.getGenericSuperclass()\t" + Test.class.getGenericSuperclass());//nullSystem.out.println("Object.class.getGenericSuperclass()\t" + Object.class.getGenericSuperclass());//nullSystem.out.println("Object.class.getSuperclass()\t" + Object.class.getSuperclass());//nullSystem.out.println("void.class.getSuperclass()\t" + void.class.getSuperclass());//nullSystem.out.println("void.class.getGenericSuperclass()\t" + void.class.getGenericSuperclass());//java.lang.ObjectSystem.out.println("int[].class.getSuperclass()\t" + int[].class.getSuperclass());//java.lang.ObjectSystem.out.println("int[].class.getGenericSuperclass()\t" + int[].class.getGenericSuperclass());}}class Person<T> {}class Student extends Person<Test> {}
jdk动态代理实际应用举例
假设我们有一个接口有两个常用的业务方法,现在有100子类都实现此接口并且复写了这两个常用的方法,但是因为产品改需求,需要在调用这两个方法前加上前置和一个后置,如果你要改代码一般蠢得做法是修改这两个实现方法的其中,代码侵入性很强。所以一般做法是通过spring的aop实现,现在我们通过jdk的动态代理原生实现下。 
//要在狗吃东西之前加上 发出命令 和 获得奖励public class Dog implements Animals {public void eat() {System.out.println("狗吃东西");}public void run() {System.out.println("狗吃跑");}}
//要在狗吃东西之前加上 发出命令 和 获得奖励public class Dog implements Animals {public void eat() {System.out.println("狗吃东西");}public void run() {System.out.println("狗吃跑");}}
import java.lang.reflect.InvocationHandler;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/*** 代理类具体的执行逻辑*/public class AnimalsProxyInvocationHandler implements InvocationHandler {private Object target;public AnimalsProxyInvocationHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {System.out.println("主任发出命令");//前置Object invoke = method.invoke(target,args);//返回执行方法的结果System.out.println("获得奖励");//后置return invoke;}public static void main(String[] args) {//目标类必须实现接口否则会抛出类转化异常Animals dogTarget = new Dog();//类加载器、代理类的接口数组(Dog类实现接口的数组)、代理业务类Animals proxy = (Animals)Proxy.newProxyInstance(dogTarget.getClass().getClassLoader(), dogTarget.getClass().getInterfaces(),new AnimalsProxyInvocationHandler(dogTarget));//重新生成一个子类进行接口方法的调用proxy.eat();}}
