文章目录
-
- 反射
-
- 反射的基本使用
-
-
- 通过Class获取Constructor 构造方法
-
- 通过Class获取Method 成员方法
-
- 通过Class获取Field 成员变量
-
- 反射应用
-
- 如何将反射应用在配置文件中
- 如何读取src目录下的properties配置文件
- 如何给ArrayList 加入Integer类型
- 通过反射技术实现动态代理(JDK动态代理)
反射
什么是反射?
反射就是通过获取类的字节码文件对象:Class
创建该类的实例(通过构造方法:Constroctor类),调用成员方法(Method类),
给成员变量赋值(Field类)
反射的应用
ArrayList 如何存储Integer类型
将某个类的全限定名称作为一个配置文件去使用
className = com.test.test1
jdk动态代理--反射实现的- InvocationHandler代理处理程序
反射的基本使用
通过Class获取Constructor 构造方法
public Constructor>[] getConstructors()
获取当前类中所有的公共的构造方法
public Constructor[] getDeclaredConstructors()
获取当前类中所有的构造方法: 公共的 私有的 默认的 受保护的
public Constructor getConstructor(Class>... parameterTypes)
获取指定的公共的构造方法
参数parameterTypes 可变参数 里面相当于数组
参数是当前的字节码文件Class
public Constructor getDeclaredConstructor(Class>... parameterTypes)
获取指定的构造方法
参数parameterTypes 可变参数 里面相当于数组
参数是当前的字节码文件Class
public void setAccessible(boolean flag):参数为true,取消java语言访问检查
public T newInstance() 直接创建该类实例
代码实现过程
package com.reflect_01;
import java.lang.reflect.Constructor;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.reflect_01.Person");
Constructor con = c.getDeclaredConstructor(
String.class,int.class,String.class);
con.setAccessible(true);
Object obj = con.newInstance("弟弟",20,"地球");
System.out.println(obj);
}
}
通过Class获取Method 成员方法
public Method getDeclaredMethod(String name, Class>... parameterTypes)
获取指定的方法
public Method getMethod(String name,Class>... parameterTypes)
获取公共的成员方法
参数1: 方法名
参数2: 当前如果该方法有形式参数
public Method[] getDeclaredMethods()
获取所有的方法:仅限本类中的,不包括继承的
public Method[] getMethods()
获取所有的公共的成员方法: 不仅有本类的还有继承的
对指定成员方法进行调用,
public Object invoke(Object obj, Object... args)
参数1: 当前类的实例
参数2: 类的形式参数
public T newInstance() 直接创建该类实例
代码实现过程
package com.reflect_02;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
@SuppressWarnings("all")
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.reflect_01.Person");
Constructor con = c.getConstructor();
Object obj = con.newInstance();
Method m = c.getMethod("show");
m.invoke(obj);
System.out.println("---------------");
Method m2 = c.getMethod("method", int.class);
Object object = m2.invoke(obj, 100);
System.out.println(object);
System.out.println("---------------");
Method m3 = c.getDeclaredMethod("function", String.class);
m3.setAccessible(true);
m3.invoke(obj, "hello,world");
}
}
通过Class获取Field 成员变量
public Field[] getDeclaredFields()获取所有的字段
public Field[] getFields()获取所有的公共的字段
public void setAccessible(boolean flag):参数为true,取消java语言访问检查
赋值: 如果获取所有的字段,赋值之前需要取消java语言访问检查
public void set(Object obj, Object value)
参数1: 当前Person类的实例
参数2: 给当前成员字段"name"设置的内容
public T newInstance() 直接创建该类实例
代码实现过程
package com.reflect_02;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@SuppressWarnings("all")
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
Class c = Class.forName("com.reflect_01.Person");
Constructor con = c.getConstructor();
Object obj = con.newInstance();
Field fields = c.getDeclaredField("name");
fields.setAccessible(true);
fields.set(obj, "弟弟");
System.out.println(obj);
System.out.println("----------");
Field fields2 = c.getDeclaredField("address");
fields2.setAccessible(true);
fields2.set(obj, "西安");
System.out.println(obj);
System.out.println("-------------");
}
}
反射应用
如何将反射应用在配置文件中
package com.qianfeng.reflect_03;
import java.io.FileReader;
import java.io.Reader;
import java.lang.reflect.Method;
import java.util.Properties;
@SuppressWarnings("all")
public class Test {
public static void main(String[] args) throws Exception {
Properties prop = new Properties() ;
Reader r = new FileReader("class.txt") ;
prop.load(r);
r.close();
System.out.println(prop);
String className = prop.getProperty("className") ;
String methodName = prop.getProperty("methondName") ;
Class c = Class.forName(className) ;
Object obj = c.newInstance() ;
Method m = c.getMethod("love") ;
m.invoke(obj) ;
}
}
package com.reflect_03;
public class Student {
public void love() {
System.out.println("Student love...");
}
}
package com.reflect_03;
public class worker {
public void love() {
System.out.println("Worker love...");
}
}
如何读取src目录下的properties配置文件
package com.qianfeng.reflect_03;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class Test2 {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = Test2.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(
"class.properties");
Properties prop = new Properties() ;
prop.load(inputStream);
String className = prop.getProperty("className") ;
String methodName = prop.getProperty("methondName") ;
Class c = Class.forName(className) ;
Object obj = c.newInstance() ;
Method m = c.getMethod(methodName) ;
m.invoke(obj) ;
}
}
如何给ArrayList 加入Integer类型
package com.reflect_03;
import java.lang.reflect.Method;
import java.util.ArrayList;
@SuppressWarnings("all")
public class Test3 {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(10);
array.add(20);
Class c = array.getClass();
System.out.println(c);
Method m = c.getMethod("add", Object.class);
m.invoke(array, "hello");
System.out.println(array);
}
}
通过反射技术实现动态代理(JDK动态代理)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
UserDao ud = new UserDaoImpl() ;
InvocationHandler my = new MyInvocationHandler(ud) ;
UserDao ud3 = (UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),
ud.getClass().getInterfaces(), my) ;
ud3.add();
ud3.delete();
ud3.search();
ud3.update();
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("权限校验--代理");
Object obj = method.invoke(target, args);
System.out.println("产生日志记录文件--代理");
return obj;
}
}
public interface UserDao {
void add();
void delete();
void search();
void update();
}
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("增");
}
@Override
public void delete() {
System.out.println("删");
}
@Override
public void search() {
System.out.println("查");
}
@Override
public void update() {
System.out.println("改");
}
}