JAVA反射+动态代理

一.什么是反射?

      反射就是对封装的成员信息与变量进行编程式访问

JAVA反射+动态代理_第1张图片

 简单来说就是从类里面拿东西 比如属性  或者构造方法

JAVA反射+动态代理_第2张图片

 二.获取Class对象:

获取Class的三种方式

JAVA反射+动态代理_第3张图片

 代码实现:

首先封装一个javabean        Student类

public class Student {
    private String name;
    private  int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }
    public  void study(){
        System.out.println("学习中");
    }
}

测试类:

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种  全类名 包名+类名  常用

        Class student = Class.forName("Student");
        System.out.println(student);
//第二种  .class文件  传递参数
        Class c=Student.class;
        //第三种 有对象
        Student s=new Student();
        Class cc=s.getClass();
        System.out.println(c+cc);
    }
}

 利用反射获取构造方法

java中的类 Constructor  可以获取构造方法

JAVA反射+动态代理_第4张图片

 测试类: 

Student的代码在上面给出了这里就不发了

import java.lang.reflect.Constructor;

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
     

        Class student = Class.forName("Student");
        Constructor [] cs= new Constructor[]{student.getConstructor()};
        for (Constructor c : cs) {
            System.out.println(c);
        }
        //其他方法请自行测试

    }
}

利用反射获取成员变量

JAVA反射+动态代理_第5张图片

 测试类 

student类在上面给出了 只是没有封装公共的成员变量

自己在Stident类里面添加一个 下面的代码就打印出内容

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {


        Class student = Class.forName("Student");
        Field[] f=student.getFields();
        for (Field field : f) {
            System.out.println(field);
        }

        //其他方法请自行测试

    }
}

利用反射获取成员方法

JAVA反射+动态代理_第6张图片

测试类 

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class demostu {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {


        Class student = Class.forName("Student");
        Method [] s=student.getMethods();
        //得到所有方法 返回数组 下面用for遍历
        for (Method method : s) {
            System.out.println(method);
        }
        //其他方法请自行测试

    }
}


动态代理:

什么是代理?

帮助对象分担部分职责    

JAVA反射+动态代理_第7张图片

 利用接口来实现代理

ikun类 javabean

public class ikun {
    private String name;
    private  int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public ikun(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public ikun() {
    }
    public  void study(String tall){
        System.out.println(tall);
    }
}

 接口:

public interface daili {
    public abstract  void study(String tall);
}

利用proxy类 实现动态代理:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class proutil {
/*
创建方法 利用Proxy 的方法实现动态代理 前提是要先创建好接口
*/
    public static daili create(ikun i) {
        Class []dailiClass = new Class[]{daili.class};
  daili daili= (daili) Proxy.newProxyInstance(proutil.class.getClassLoader(), dailiClass, new InvocationHandler() {
      /*
       * 动态代理  第一个参数指定类加载器  由谁来加载代理
       * 第二个参数就是指定代理
       * 参数三 指定代理的行为
       *
       * */
      @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("代理");
                //这里是可以用反射去实现动态代理的  大家可以自己去尝试
          if ("study".equals(method.getName())){
              System.out.println("测试代码成功");
          }
                return null;
                /*这里指定的参数一  是代理的对象
                参数二.代理要运行的方法
                参数三.调用方法时传递的实际参数
                * */

            }
        });
        return daili;
    }
}

测试类: 

public class dondemo {
    public static void main(String[] args) {
       ikun i=new ikun();
     daili d=  proutil.create(i).study("你好");
    }
}

如果有帮助到您  可以点个关注谢谢!阿里嘎多

你可能感兴趣的:(JAVA,java,开发语言)