欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java反射机制与动态代理,java反射机制

来源: javaer 分享于  点击 13436 次 点评:18

Java反射机制与动态代理,java反射机制


三种获取当前的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("实现功能");
    }

}

相关文章

    暂无相关文章
相关栏目:

用户点评