Java反射机制详解
作者:Array_new 时间:2023-05-20 11:09:47
什么是反射?
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
哪里用到反射机制
JDBC中,利用反射动态加载了数据库驱动程序。
Web服务器中利用反射调用了Sevlet的服务方法。
Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
很多框架都用到反射机制,注入属性,调用方法,如Spring。
* 是什么
有哪些应用?
* 是运行时动态生成代理类。
* 的应用有 Spring AOP数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。
怎么实现 *
JDK 原生 * 和 cglib * 。
JDK 原生 * 是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
Java反射机制的作用
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
Java 反射机制的优缺点
优点:
能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
与 Java 动态编译相结合,可以实现无比强大的功能。
对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
缺点:
反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。
如何使用Java的反射
通过一个全限类名创建一个对象
Class.forName(“全限类名”);
例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
类名.class; 获取Class<?> clz 对象
对象.getClass();
获取构造器对象,通过构造器new出一个对象
Clazz.getConstructor([String.class]);
Con.newInstance([参数]);
通过class对象创建一个实例对象(就相当与new类名()无参构造器)
Cls.newInstance();
通过class对象获得一个属性对象
Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
通过class对象获得一个方法对象
Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
M.setAccessible(true);(让私有的方法可以执行)
让方法执行
Method.invoke(obj实例对象,obj可变参数);
-----(是有返回值的)
//测试类
public class Demo {
public String name;
public void inputAndoutput {
BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String aa;
while ( !(aa= br.readLine()).equals("bye")){
bufferedWriter.write(aa);
bufferedWriter.newLine();
bufferedWriter.flush();
}
br.close();
bufferedWriter.close();
}
public Demo(){
}
public void print(){
System.out.println(this.name);
}
public void reverseWords(String s) {
System.out.println(s);
return s;
}
}
//利用反射
Class c=new Demo().getClass();
System.out.println(c.toString());
Class[] classes=c.getClasses();
for (Class ca:classes){
System.out.println(ca.toString());
}
Arrays.stream(c.getFields()).forEach(s->{
System.out.println(s.toString());
});
来源:https://blog.csdn.net/Array_new/article/details/126907135