一、杂七杂八
- 自动装箱和自动拆箱
自动装箱是指将int等基本类型转换为Integer类等
Integer i = 123; // 隐式调用了Integer.valueOf(123)
Integer i = Integer.valueOf(123);
自动拆箱是指将Integer类等转换为int等基本类型
- 缓存池
int类型有[-128, 127]的缓存池,如果
二、Java反射+动态代理
//定义一个接口协议
interface CalculatorProtocol{
public int add(int a, int b); //两个数相加
public int subtract(int a, int b); //两个数相减
}
//实现接口协议
class Server implements CalculatorProtocol {
public int add(int a, int b) {
return a+b;
}
public int subtract(int a, int b) {
return a-b;
}
}
//实现调用处理器接口
class CalculatorHandler implements InvocationHandler {
private Object objOriginal;
public CalculatorHandler(Object obj) {
this.objOriginal=obj;
}
public Object invoke(Object proxy, Method method, Object[]args) throws Throwable {
//可添加一些预处理
Object result=method.invoke(this.objOriginal, args);
//可添加一些后续处理
return result;
}
}
//测试用例
public class DynamicProxyExample {
public static void main(String[]args) {
// 创建Server
CalculatorProtocol server=new Server();
InvocationHandler handler=new CalculatorHandler(server);
// 创建一个Client
CalculatorProtocol client=(CalculatorProtocol)Proxy.newProxyInstance(server.getClass().getClassLoader(), server.getClass().getInterfaces(), handler);
int r=client.add(5,3);
System.out.println("5+3="+r);
r=client.subtract(10,2);
System.out.println("10-2="+r);
}
}
在上面这个例子,用户只需要实现InvocationHandler的invoke方法就可以完成对CalculatorProtocol动态代理类上的方法调用,具体调用时可以使用client这个对象代理了Server类,需要server执行的操作,都调用client来做,client会自己在内部再次调用Server类,client可能自己还会加入一些操作
用户在开发时时候并不知道server对象是哪个类,只知道这个它实现了CalculatorProtocol
为了实现这种代理,java语言需要提供一些机制:
❑Class类:代表一个Java类。
❑Field类:代表Java类的属性。
❑Method类:代表Java类的方法。
❑Constructor类:代表Java类的构造函数。 ❑Array类:提供了动态创建数组,以及访问数组元素的静态方法。
❑Proxy类以及InvocationHandler接口:提供了动态生成代理类以及实例的方法。
打印当前目录
System.out.println(System.getProperty("user.dir"));