软件编程
位置:首页>> 软件编程>> java编程>> Java反射机制详解

Java反射机制详解

作者:Array_new  发布时间:2023-05-20 11:09:47 

标签:Java,反射,机制

什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 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(&ldquo;方法名&rdquo;,class&hellip;&hellip;parameaType);(只能获取公共的)

Cls.getDeclareMethod(&ldquo;方法名&rdquo;);(获取任意修饰的方法,不能执行私有)

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com