首页 Java java教程 Java反射的分析介绍

Java反射的分析介绍

Mar 09, 2017 pm 07:05 PM
java反射

这篇文件讲述Java反射的分析介绍

一、什么是反射?
  通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。

二、反射能做什么?
  我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以再运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的时反射使用不当会成本很高!

三、反射的具体实现

  下面是一个基本的类 Person

package com.ys.reflex;
public class Person {
    //私有属性
    private String name = "Tom";
    //公有属性
    public int age = 18;
    //构造方法
    public Person() {    
    }
    //私有方法
    private void say(){
        System.out.println("private say()...");
    }
    //公有方法
    public void work(){
        System.out.println("public work()...");
    }
}
登录后复制

①、得到 Class 的三种方式

//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
//  类型的对象,而我不知道你具体是什么类,用这种方法
  Person p1 = new Person();
  Class c1 = p1.getClass();
        
//2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
//  这说明任何一个类都有一个隐含的静态成员变量 class
  Class c2 = Person.class;
        
//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
//   但可能抛出 ClassNotFoundException 异常
  Class c3 = Class.forName("com.ys.reflex.Person");
登录后复制

需要注意的是:一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 c1,c2,c3进行 equals 比较,发现都是true

②、通过 Class 类获取成员变量、成员方法、接口、超类、构造方法等

查阅 API 可以看到 Class 有很多方法:

  getName():获得类的完整名字。
  getFields():获得类的public类型的属性。
  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  getMethods():获得类的public类型的方法。
  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  getConstructors():获得类的public类型的构造方法。
  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

我们通过一个例子来综合演示上面的方法:

//获得类完整的名字
String className = c2.getName();
System.out.println(className);//输出com.ys.reflex.Person
        
//获得类的public类型的属性。
Field[] fields = c2.getFields();
for(Field field : fields){
   System.out.println(field.getName());//age
}
        
//获得类的所有属性。包括私有的和继承类的
Field [] allFields = c2.getDeclaredFields();
for(Field field : allFields){
    System.out.println(field.getName());//name    age
}
        
//获得类的public类型的方法。这里包括 Object 类的一些方法
Method [] methods = c2.getMethods();
for(Method method : methods){
    System.out.println(method.getName());//work waid equls toString hashCode等
}
        
//获得类的所有方法。
Method [] allMethods = c2.getDeclaredMethods();
for(Method method : allMethods){
    System.out.println(method.getName());//work say
}
        
//获得指定的属性
Field f1 = c2.getField("age");
System.out.println(f1);
//获得指定的私有属性
Field f2 = c2.getDeclaredField("name");
//启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
f2.setAccessible(true);
System.out.println(f2);
                
//创建这个类的一个对象
Object p2 =  c2.newInstance();
//将 p2 对象的  f2 属性赋值为 Bob,f2 属性即为 私有属性 name
f2.set(p2,"Bob");
//使用反射机制可以打破封装性,导致了java对象的属性不安全。 
System.out.println(f2.get(p2)); //Bob
        
//获取构造方法
Constructor [] constructors = c2.getConstructors();
for(Constructor constructor : constructors){
    System.out.println(constructor.toString());//public com.ys.reflex.Person()
}
登录后复制

四、反射总结

灵活使用反射能让我们代码更加灵活,这里比如JDBC原生代码注册驱动,hibernate 的实体类,Spring 的 AOP等等都有反射的实现。但是凡事都有两面性,反射也会让增加系统的性能,复杂性等,合理使用才是真!

 

以上是Java反射的分析介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用Java反射进行逆向工程:揭秘软件的内部运作方式 使用Java反射进行逆向工程:揭秘软件的内部运作方式 Feb 19, 2024 pm 11:20 PM

Java反射是一个强大的工具,它可以让你访问类的私有字段和方法,从而揭秘软件的内部运作方式。这在逆向工程、软件分析和调试等领域非常有用。要使用Java反射,首先需要导入java.lang.reflect包。然后,你可以使用Class.forName()方法来获取一个类的Class对象。一旦有了Class对象,你就可以使用各种方法来访问类的字段和方法。例如,你可以使用getDeclaredFields()方法来获取类的所有字段,包括私有字段。你也可以使用getDeclaredMethods()方法

java反射如何获取属性的值 java反射如何获取属性的值 Jan 03, 2024 pm 03:05 PM

获取方法:1、创建一个示例对象;2、通过field.get(person)获取了字段的值,其中person是示例对象,而field是Field对象,表示一个字段;3、通过setAccessible(true)设置字段为可访问状态,即使是私有字段也可以获取其值;4、遍历字段数组,可以获取每个字段的名称和对应的值,并打印出来即可。

java的反射机制原理是什么 java的反射机制原理是什么 Jun 21, 2023 am 10:53 AM

Java反射机制原理是,当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,创建一个对象的Class对象,jvm把字节码文件信息都存储到Class对象中,只要获取到Class对象,就能使用该对象设置对象的属性或方法等。反射机制是,在运行状态中对任意一个类,都知道这个类的所有属性和方法,对于任意一个对象,能够调用其任意属性和方法,动态获取信息以及动态调用对象方法的功能。

如何使用Java反射机制创建对象? 如何使用Java反射机制创建对象? Apr 15, 2024 pm 04:18 PM

通过Java反射机制创建对象步骤如下:加载目标类:使用Class.forName()方法。获取构造函数:使用getDeclaredConstructor()方法。创建对象:使用newInstance()方法传递参数。

深入理解Java反射机制的原理与应用 深入理解Java反射机制的原理与应用 Dec 23, 2023 am 09:09 AM

深入理解Java反射机制的原理与应用一、反射机制的概念与原理反射机制是指在程序运行时动态地获取类的信息、访问和操作类的成员(属性、方法、构造方法等)的能力。通过反射机制,我们可以在程序运行时动态地创建对象、调用方法和访问属性,而不需要在编译时知道类的具体信息。反射机制的核心是java.lang.reflect包中的类和接口。其中,Class类代表一个类的字节

如何使用java反射获取对象属性和值 如何使用java反射获取对象属性和值 Jan 03, 2024 pm 02:43 PM

获取方法:1、创建一个Person类,通过反射获取了该类的Class对象;2、使用getDeclaredFields方法获取了该类的所有字段;3、通过遍历字段数组,设置字段为可访问状态,然后使用get方法获取字段的值,并打印字段名和值即可。

Java中的NoSuchFieldException异常在什么场景下出现? Java中的NoSuchFieldException异常在什么场景下出现? Jun 25, 2023 am 11:51 AM

Java中的NoSuchFieldException异常指的是在反射过程中试图访问不存在的字段(Field)时抛出的异常。在Java中,反射可以让我们通过代码来操纵程序中的类、方法、变量等,使得程序具有更高的灵活性和扩展性。但是,在使用反射时,如果访问的字段不存在,则会抛出NoSuchFieldException异常。NoSuchFieldException

java反射有哪些调用方法 java反射有哪些调用方法 Dec 22, 2023 pm 05:09 PM

java反射调用方法有:1、Class类;2、Constructor类;3、Method类;4、Field类;5、ClassLoader类。详细介绍:1、Class类,用于获取类的信息,包括类的名称、成员变量和方法等,可以通过Class类的"newInstance()"方法创建类的实例;2、Constructor类,用于获取构造函数的参数类型、修饰符和返回类型等信息等等。

See all articles