Java:反射與代理

來源:互聯網
上載者:User

標籤:

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 stubDatabaseOps 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 {@Overridepublic void listUser() {System.out.println("user listed");}@Overridepublic void deleteUser(int id) {// TODO Auto-generated method stubSystem.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");}@Overridepublic String toString() {return "ValueFields [a=" + a + ", b=" + b + ", c=" + c + "]";}}class DbOpsWrap implements InvocationHandler {private DbOpsImpl proxied;public DbOpsWrap(DbOpsImpl impl) {proxied = impl;}@Overridepublic 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方法。

Java:反射與代理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.