java获取对象的三种形式
1. new 关键字
User user = new User();
2. 获取Class类,使用newInstance
//获取Class对象的三种方法Class userClass = user.getClass();Class userClass1 = User.class();Class userClass2 = Class.forName("com.test.User");User user = userClass.newInstance();
3. 通过反射获取构造器(构造方法)然后newInstance
Class userClass = Class.forName("com.test.User");//获取所有构造器Constructor<User>[] constructors = userClass.getConstructors();//获取指定构造器Constructor<User> constructor = userClass.getConstructor(String.class,int.class);User user = constructor.newInstance("zhangsan",26);
动态代理模式
两个重要的类和接口InvocationHandler接口,Proxy类。
实现步骤
1.创建一个代理类,实现InvocationHandler接口。
public class CyCompany implements InvocationHandler{//持有的真实对象private Object factory;public Object getFactory() {return factory;}public void setFactory(Object factory) {this.factory = factory;}//通过Proxy获取动态代理对象public Object getProxyInstance(){return Proxy.newProxyInstance(factory.getClass().getClassLoader(),factory.getClass().getInterfaces(),this);}/*通过动态代理对象方法进行增强*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {doSthAfter();Object result = method.invoke(factory, args);doSthBefore();return result;}/*前置处理器*/private void doSthAfter() {System.out.println("前置处理器");}/*后置处理器*/private void doSthBefore() {System.out.println("后置处理器");}}
2.需要一个被代理类
public class AFactory implements ToolFactory{@Overridepublic void saleTools(String size) {System.out.println("按需求定制了一个size为"+size+"扳手");}}public interface ToolFactory {void saleTools(String size);}
3.动态代理类使用
public class Client {public static void main(String[] args) {//动态代理模式ToolFactory aFactory = new AFactory();CyCompany cyCompany = new CyCompany();cyCompany.setFactory(aFactory);ToolFactory toolFactory = (ToolFactory) cyCompany.getProxyInstance();toolFactory.saleTools("sss");}}
