一.什么是反射?
反射就是对封装的成员信息与变量进行编程式访问
简单来说就是从类里面拿东西 比如属性 或者构造方法
二.获取Class对象:
获取Class的三种方式
代码实现:
首先封装一个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 可以获取构造方法
测试类:
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);
}
//其他方法请自行测试
}
}
利用反射获取成员变量
测试类
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);
}
//其他方法请自行测试
}
}
利用反射获取成员方法
测试类
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);
}
//其他方法请自行测试
}
}
动态代理:
什么是代理?
帮助对象分担部分职责
利用接口来实现代理
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("你好");
}
}
如果有帮助到您 可以点个关注谢谢!阿里嘎多