java获取对象的三种形式

1. new 关键字

  1. User user = new User();

2. 获取Class类,使用newInstance

  1. //获取Class对象的三种方法
  2. Class userClass = user.getClass();
  3. Class userClass1 = User.class();
  4. Class userClass2 = Class.forName("com.test.User");
  5. User user = userClass.newInstance();

3. 通过反射获取构造器(构造方法)然后newInstance

  1. Class userClass = Class.forName("com.test.User");
  2. //获取所有构造器
  3. Constructor<User>[] constructors = userClass.getConstructors();
  4. //获取指定构造器
  5. Constructor<User> constructor = userClass.getConstructor(String.class,int.class);
  6. User user = constructor.newInstance("zhangsan",26);

动态代理模式

两个重要的类和接口InvocationHandler接口,Proxy类。
实现步骤

1.创建一个代理类,实现InvocationHandler接口。

  1. public class CyCompany implements InvocationHandler{
  2. //持有的真实对象
  3. private Object factory;
  4. public Object getFactory() {
  5. return factory;
  6. }
  7. public void setFactory(Object factory) {
  8. this.factory = factory;
  9. }
  10. //通过Proxy获取动态代理对象
  11. public Object getProxyInstance(){
  12. return Proxy.newProxyInstance(factory.getClass().getClassLoader(),
  13. factory.getClass().getInterfaces(),this);
  14. }
  15. /*通过动态代理对象方法进行增强*/
  16. @Override
  17. public Object invoke(Object proxy, Method method, Object[] args)
  18. throws Throwable {
  19. doSthAfter();
  20. Object result = method.invoke(factory, args);
  21. doSthBefore();
  22. return result;
  23. }
  24. /*前置处理器*/
  25. private void doSthAfter() {
  26. System.out.println("前置处理器");
  27. }
  28. /*后置处理器*/
  29. private void doSthBefore() {
  30. System.out.println("后置处理器");
  31. }
  32. }

2.需要一个被代理类

  1. public class AFactory implements ToolFactory{
  2. @Override
  3. public void saleTools(String size) {
  4. System.out.println("按需求定制了一个size为"+size+"扳手");
  5. }
  6. }
  7. public interface ToolFactory {
  8. void saleTools(String size);
  9. }

3.动态代理类使用

  1. public class Client {
  2. public static void main(String[] args) {
  3. //动态代理模式
  4. ToolFactory aFactory = new AFactory();
  5. CyCompany cyCompany = new CyCompany();
  6. cyCompany.setFactory(aFactory);
  7. ToolFactory toolFactory = (ToolFactory) cyCompany.getProxyInstance();
  8. toolFactory.saleTools("sss");
  9. }
  10. }