zoukankan      html  css  js  c++  java
  • Java:反射与代理

    Java世界的繁荣反射这一特性有很大功劳,可以获取全面的类型信息。

    /**
     * 
     */
    package ref;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * @author hegaofeng
     *
     */
    public class Invoker {
    
    	/**
    	 * @param args
    	 * @throws SecurityException 
    	 * @throws NoSuchFieldException 
    	 * @throws IllegalAccessException 
    	 * @throws IllegalArgumentException 
    	 * @throws InvocationTargetException 
    	 * @throws NoSuchMethodException 
    	 */
    	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    		// TODO Auto-generated method stub
    		DatabaseOps ops = (DatabaseOps)Proxy.newProxyInstance(
    				DbOpsWrap.class.getClassLoader(), 
    				new Class[]{DatabaseOps.class}, 
    				new DbOpsWrap(new DbOpsImpl()));
    		ops.deleteUser(100);
    		ops.listUser();
    		
    		ValueFields obj = new ValueFields();
    		System.out.println(obj);
    		
    		
    		Class<?> cv = ValueFields.class;
    		Field a = cv.getDeclaredField("a");
    		a.setAccessible(true);
    		a.set(obj, 12345);
    		System.out.println(obj);
    		
    		
    		Method m = cv.getDeclaredMethod("show", null);
    		m.setAccessible(true);
    		m.invoke(obj, null);
    	}
    
    }
    
    class DbOpsImpl implements DatabaseOps {
    
    	@Override
    	public void listUser() {
    		System.out.println("user listed");
    	}
    
    	@Override
    	public void deleteUser(int id) {
    		// TODO Auto-generated method stub
    		System.out.println("user:" + id + " deleted.");
    	}
    }
    
    class ValueFields {
    	private int a = 1;
    	protected int b=2;
    	public String c="name";
    	
    	
    	private void show() {
    		System.out.println("private method show");
    	}
    	
    	@Override
    	public String toString() {
    		return "ValueFields [a=" + a + ", b=" + b + ", c=" + c + "]";
    	}
    }
    
    class DbOpsWrap implements InvocationHandler {
    	private DbOpsImpl proxied;
    	
    	public DbOpsWrap(DbOpsImpl impl) {
    		proxied = impl;
    	}
    	
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args)
    			throws Throwable {
    		
    		System.out.println(method.getName());
    		return method.invoke(proxied, args);
    	}
    }
    
    interface DatabaseOps{
    	void listUser();
    	void deleteUser(int id);
    }
    

    Class中的

    getDeclaredXXX系列函数用于获取定义在该类本层的属性方法(不包括从基类继承得到的)

    getXXX系列函数用于获取所有public的属性方法,包括从父类继承得到的,但不含private,protected等非public方法。

  • 相关阅读:
    三、Vue CLI-单页面
    width100%,设置padding或border溢出解决方法
    一、Linux平台部署ASP.NET、ASP.NET CORE、PHP
    二、Core授权-2 之.net core 基于Identity 授权
    一、doT.js使用笔记
    一、域名认证信息
    HB-打包
    一、模型验证CoreWebApi 管道方式(非过滤器处理)2(IApplicationBuilder扩展方法的另一种写法)
    python 写的几道题
    美团面试总结
  • 原文地址:https://www.cnblogs.com/lailailai/p/4378926.html
Copyright © 2011-2022 走看看