Java反射机制与动态代理

来源:互联网 发布:雅思怎么做精听 知乎 编辑:程序博客网 时间:2024/05/16 10:42

三种获取当前的Class类对象
1)Object类中有一个方法:getClass()
2)通过数据类型的静态属性;String.class,int.class,Person.class
3)Class类中提供了一一个方法:forName(“当前类的全路径名称”);


Class类应用

Field
getField() getFields() getDeclaredField() getDeclaredFields()
Constructor
getConstrutor() getConstrutors() getConDeclaredConstructor() getConDeclaredConstructors()
Method
getMethod() getMethods() getDeclaredMethod() getDeclaredMethods()

带s返回的是数组,带Declared返回的指定 啥都不加返回的公有

//下面是常的的反射方法

public class Person {    private String name ;    int age ;    public String address ;    public Person(){    }    //构造方法    private Person(String name){        this.name = name ;    }    Person(String name,int age){        this.name = name ;        this.age = age ;    }    public Person(String name,int age,String address){        this.name = name ;        this.age = age ;        this.address = address ;    }    //成员方法    public void show(){        System.out.println("show");    }    public void method(String s){        System.out.println("method"+s);    }    public String getString(String s,int i){        return s+"---"+i ;    }    private void function(){        System.out.println("function");    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", address=" + address                + "]";    }}--------------------------------------------------------------------//用构造器建立对象 线面代码要用到//public Constructor<T> getConstructor(Class<?>... parameterTypes)Constructor con = c.getConstructor(String.class,int.class,String.class) ;Object obj   = con.newInstance();   重点是但参数的方法反射格式的写法,如获取指定参数的时候c.getMethod("getString", String.class,int.class)"getString"表示方法名.其他的自己可以试一试             1有参构造方法        //有参数的构造方法        //public Constructor<T> getConstructor(Class<?>... parameterTypes)        Constructor con = c.getConstructor(String.class,int.class,String.class) ;        //创建构造方法的实例:NewInstance(Object...args):传递的是实际操作        Object obj = con.newInstance("高圆圆",27,"户县");        //输出当前这个对象        System.out.println(obj);2获取字段           //获取指定的字段的方法        Field nameField = c.getDeclaredField("name") ;        nameField.setAccessible(true) ;        nameField.set(obj, "高圆圆");3单个的公共方法的获取        Method m3 = c.getMethod("getString", String.class,int.class) ;        //调用方法进行实际参数的传递        Object resultString = m3.invoke(obj, "world",100);        System.out.println(resultString);   

动态代理

/*
代理类
*/

public class Main {    public static void main(String[] args) {        UserDao ud=new UserDaoImpl();        MyInvocationHandler mih=new MyInvocationHandler(ud);        UserDao proxy=(UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),                ud.getClass().getInterfaces(), mih);        proxy.add();        proxy.delete();    }}

/*
*
* InvocationHandler 是代理实例的调用处理程序 实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,
将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

  • */
public class MyInvocationHandler implements InvocationHandler{    //    public Object target;    public MyInvocationHandler(Object target) {        this.target=target;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        // TODO Auto-generated method stub        Object result=method.invoke(target, args);        return result;    }}public interface UserDao {    public void delete();    public void add();    public void update();    public void find();}   public class UserDaoImpl implements UserDao{    @Override    public void delete() {        // TODO Auto-generated method stub        System.out.println("实现功能");    }    @Override    public void add() {        // TODO Auto-generated method stub        System.out.println("实现功能");    }    @Override    public void update() {        // TODO Auto-generated method stub        System.out.println("实现功能");    }    @Override    public void find() {        // TODO Auto-generated method stub        System.out.println("实现功能");    }}
原创粉丝点击