反射※
获取类信息的三种方式
- 类名.class
- 对象.getClass();
- Class.forName(“全限定名->包名+类名”);
能否获取方法的参数名?
我们为什么能/不能获得到方法的参数名?
如何通过类信息创建这个类的的对象?
newlnstance()
- String s = “java.util .Random”;
Object m = Class.forName(s) .newlnstance(); - e.getClass0.newlnstance();
invoke ()
反射的具体应用
- 一个jdbc驱动连接的载入
- servlet原理
lambda 表达式
以及新的java版本的升级
内部类
内部类中声明的所有静态域都必须是 final。 为什么
内部类的语法规则
代理※
示例传送门:https://blog.csdn.net/weixin_42505605/article/details/102073376
静态代理模式
动态模式
-
jdk提供的代理模式
-
public class DynamicTest { public static void main(String[] args) { Singer cai = new Cai(); //被代理的类的类加载器 //被代理的类的接口类信息数组 //怎么样被代理的 增强的功能规则 Object o = Proxy.newProxyInstance(Cai.class.getClassLoader(), Cai.class.getInterfaces(), new SingerProxy(cai)); if(o instanceof Singer){ Singer s= (Singer) o; s.singing(); int i = s.playBasketBall(123); System.out.println("返回值是"+i); s.toString(); s.dance(); s.hashCode(); } } } class SingerProxy implements InvocationHandler { private Singer singer; public SingerProxy(Singer singer) { this.singer = singer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()+"方法名字"); if(args!=null&&args.length != 0){ for (Object arg : args) { System.out.println("参数是:"+arg); } } return method.invoke(singer,args); } }
public class DynamicProxy {
public static void main(String[] args) {
Singer cai = new Cai();
class SingerHandle implements InvocationHandler {
private Singer singer;
public SingerHandle(Singer singer) {
this.singer = singer;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("zhangsan");
return method.invoke(singer, args);
}
}
Singer o = (Singer) Proxy.newProxyInstance(Singer.class.getClassLoader(), Cai.class.getInterfaces(),
new SingerHandle(cai));
//o 是一个新创建的 cai的代理类-> T 的实例 这个代理类 T 一定实现了 Singer接口
o.singing();
Singer i = (Singer) Proxy.newProxyInstance(Singer.class.getClassLoader(), Cai.class.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("匿名内部类");
return method.invoke(cai, args);
}
});
Singer i1 = (Singer) Proxy.newProxyInstance(Cai.class.getClassLoader(), Cai.class.getInterfaces(),
(proxy, method, params) -> {
System.out.println("lambda");
int invoke =(int) method.invoke(cai, params);
return invoke*2;
});
int i2 = i1.playBasketBall(10);
System.out.println(i2);
}
}
还有一种是Cglib代理模式
区别和联系
主要应用场景