`
fuyanqing03
  • 浏览: 61634 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java 反射 总结

阅读更多
java 反射 总结


一、Class 类 :注意和关键字 class 不是一回事。


Class:java.lang包下的;没有公开的构造方法;不允许直接创建对象;只能通过具体类获得;用来描述其他的一个类型

Class 类的实例表示正在运行的 Java 应用程序中的类和接口

获得一个Class对象的方式:
1) Class c1=Class.forName("(类名=)Student");
2) Class c2=Student.class;
3) Student s1=new Student("");
Class c3=s1.getClass();
不管通过哪种方式获得的,都是同一个对象;一种类型和一个Class对象一一对应;看如下程序, OuterA 是test包下的一个普通类。

Class c1 = Class.forName("test.OuterA");
System.out.println(c1);
Class c2 = OuterA.class;
System.out.println(c2==c1);//结果为:true
OuterA out = new OuterA();
Class c3 = out.getClass();
System.out.println(c3==c1);//结果为:true

Class 类的方法介绍:

1.int getModifiers() ;//得到此类的修饰符的int值;

Modifiers.toString(int);//返回的就是那个修饰符名称; 例如:

String modifier = Modifier.toString(c1.getModifiers());
System.out.println(modifier);

2. Class[] getInterfaces() //如果此对象表示一个类,则返回值是一个数组,它包含了表示该类所实现的所有接口的对象。数组中接口对象顺序与此对象所表示的类的声明的 implements 子句中接口名顺序一致。 例如 类 ExFrame 如下:

public class ExFrame extends JFrame implements ActionListener,Serializable{
public int intAtt;
private double result;
public void actionPerformed(ActionEvent arg0) {
}
}

在main方法里:

Class cc = ExFrame.class;
Class[] interfaces = cc.getInterfaces();
for(int i=0; i<interfaces.length; i++){
System.out.println(interfaces[i]);
}

结果如下:

interface java.awt.event.ActionListener
interface java.io.Serializable

3. Field[] getDeclaredFields();//得到所有属性;
Field[] getFields();//得到所有公开属性

Field[] fields = cc.getDeclaredFields();

for(int i=0; i<fields.length; i++){
System.out.println(fields[i]);
}

结果如下:

public int test.ExFrame.intAtt
private double test.ExFrame.result


4. Constructor<T> getDeclaredConstructor(Class... parameterTypes)
... :可变长参数, 0个~多个,来决定得到哪个构造方法;

5. Method getDeclaredMethod(String name, Class... parameterTypes)
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类
或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

6. Class<?>[] getParameterTypes() 得到参数表;
Class<?>[] getExceptionTypes() 得到异常类型;

二、反射机制的理解

反射的真正目的是让 JVM动态加载类,并且来调用方法和修改属性;

并不是通过程序设置的,而是通过参数来加载类;类名不不出现在源码中;

一般是在源代码中:创建一个对象时,才加载这个类;

反射 不是给应用程序开发人员用的,是给框架开发人员用的;

T newInstance() ;生成新的对象;

Method getMethod(String name, Class... parameterTypes)

三、属性:类Field

Field 类封装了一个类的属性的所有描述 包括 修饰符、属性类型、属性值、属性的注释,提供了一系列 get/set 方法来获得修改属性的值

类 Class 中有个方法:Field getField(String name) ; 可以得到 Field

Field 中常用的方法:

Object get(Object obj) ;
void set(Object obj, Object value) ;

Field f=c.getField("name"); //得到obj对象的name属性的值;
f.get(obj); \\等价于obj.name;
f.set(obj1,"hehe");//把obj1的f属性设置为hehe;

四、方法: 类Method

Method 类封装了一个类的所有方法的描述 包括 修饰符、返回类型、方法名、参数列表、注释、异常信息,还提供了 invoke 方法 来调用自己

Method 有一个invoke方法: Object invoke(Object obj, Object... args)
调用invoke这个方法时至少传一个对象,
第一个参数:表示在哪个对象上调用该方法 ;
第二个参数:表示传给该方法的参数;可以是0个或多个;
Method m=c.getMethod("move"); //调用obj1的move方法;
m.invoke(obj1,"hello","hehe"); //等价于相当于传统的调用:obj1.move("hello","hehe");

优势:是方法和方法参数都可以 通过参数传的,并不用写死在程序中;

五、构造方法 : 类 Constructor<T>

Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

对于无参构造方法,直接调用 Class 类的 newInstance() 方法就可以构造一个对象。

对于有参数的构造方法,先点用 Class 类的 getConstructors() ,利用返回的 Constructor 的对象 调用 newInstance(Object obj1,...);例如

public class ExFrame extends JFrame implements ActionListener,Serializable{
public int intAtt=9;
private double result=90.0;

public ExFrame(JPanel pane, int i){

}
public void actionPerformed(ActionEvent arg0) {
System.out.println("actionPerformed is invoked.....");
}
}

Constructor [] cons = cc.getConstructors();
ExFrame ef = (ExFrame)cons[0].newInstance(new JPanel(), new Integer(20));

六、通过反射可以访问对象的私有属性吗?

访问权限对java虚拟机都是无效的,对于私有属性而言,反射是可以访问到的;
Field f = c.getDeclaredField("name");
f.setAccessible(true);//私有属性必须加上这个才有效
System.out.println("obj name is: "+f.get(obj));

同样对私有成员方法有效:m.setAccessible(true);
对于私有构造方法同样有效,con.setAccessible(true);
构造方法为私有的就不能在外部new它的实例,但是通过反射可以;

但是既然设为私有,没有特殊情况不要打破封装;


Class:java.lang包下的;没有公开的构造方法;不允许直接创建对象;只能通过具体类获得;用来描述其他的一个类型

Class 类的实例表示正在运行的 Java 应用程序中的类和接口

获得一个Class对象的方式:
1) Class c1=Class.forName("(类名=)Student");
2) Class c2=Student.class;
3) Student s1=new Student("");
Class c3=s1.getClass();
不管通过哪种方式获得的,都是同一个对象;一种类型和一个Class对象一一对应;看如下程序, OuterA 是test包下的一个普通类。

Class c1 = Class.forName("test.OuterA");
System.out.println(c1);
Class c2 = OuterA.class;
System.out.println(c2==c1);//结果为:true
OuterA out = new OuterA();
Class c3 = out.getClass();
System.out.println(c3==c1);//结果为:true

Class 类的方法介绍:

1.int getModifiers() ;//得到此类的修饰符的int值;

Modifiers.toString(int);//返回的就是那个修饰符名称; 例如:

String modifier = Modifier.toString(c1.getModifiers());
System.out.println(modifier);

2. Class[] getInterfaces() //如果此对象表示一个类,则返回值是一个数组,它包含了表示该类所实现的所有接口的对象。数组中接口对象顺序与此对象所表示的类的声明的 implements 子句中接口名顺序一致。 例如 类 ExFrame 如下:

public class ExFrame extends JFrame implements ActionListener,Serializable{
public int intAtt;
private double result;
public void actionPerformed(ActionEvent arg0) {
}
}

在main方法里:

Class cc = ExFrame.class;
Class[] interfaces = cc.getInterfaces();
for(int i=0; i<interfaces.length; i++){
System.out.println(interfaces[i]);
}

结果如下:

interface java.awt.event.ActionListener
interface java.io.Serializable

3. Field[] getDeclaredFields();//得到所有属性;
Field[] getFields();//得到所有公开属性

Field[] fields = cc.getDeclaredFields();

for(int i=0; i<fields.length; i++){
System.out.println(fields[i]);
}

结果如下:

public int test.ExFrame.intAtt
private double test.ExFrame.result


4. Constructor<T> getDeclaredConstructor(Class... parameterTypes)
... :可变长参数, 0个~多个,来决定得到哪个构造方法;

5. Method getDeclaredMethod(String name, Class... parameterTypes)
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类
或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

6. Class<?>[] getParameterTypes() 得到参数表;
Class<?>[] getExceptionTypes() 得到异常类型;

二、反射机制的理解

反射的真正目的是让 JVM动态加载类,并且来调用方法和修改属性;

并不是通过程序设置的,而是通过参数来加载类;类名不不出现在源码中;

一般是在源代码中:创建一个对象时,才加载这个类;

反射 不是给应用程序开发人员用的,是给框架开发人员用的;

T newInstance() ;生成新的对象;

Method getMethod(String name, Class... parameterTypes)

三、属性:类Field

Field 类封装了一个类的属性的所有描述 包括 修饰符、属性类型、属性值、属性的注释,提供了一系列 get/set 方法来获得修改属性的值

类 Class 中有个方法:Field getField(String name) ; 可以得到 Field

Field 中常用的方法:

Object get(Object obj) ;
void set(Object obj, Object value) ;

Field f=c.getField("name"); //得到obj对象的name属性的值;
f.get(obj); \\等价于obj.name;
f.set(obj1,"hehe");//把obj1的f属性设置为hehe;

四、方法: 类Method

Method 类封装了一个类的所有方法的描述 包括 修饰符、返回类型、方法名、参数列表、注释、异常信息,还提供了 invoke 方法 来调用自己

Method 有一个invoke方法: Object invoke(Object obj, Object... args)
调用invoke这个方法时至少传一个对象,
第一个参数:表示在哪个对象上调用该方法 ;
第二个参数:表示传给该方法的参数;可以是0个或多个;
Method m=c.getMethod("move"); //调用obj1的move方法;
m.invoke(obj1,"hello","hehe"); //等价于相当于传统的调用:obj1.move("hello","hehe");

优势:是方法和方法参数都可以 通过参数传的,并不用写死在程序中;

五、构造方法 : 类 Constructor<T>

Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

对于无参构造方法,直接调用 Class 类的 newInstance() 方法就可以构造一个对象。

对于有参数的构造方法,先点用 Class 类的 getConstructors() ,利用返回的 Constructor 的对象 调用 newInstance(Object obj1,...);例如

public class ExFrame extends JFrame implements ActionListener,Serializable{
public int intAtt=9;
private double result=90.0;

public ExFrame(JPanel pane, int i){

}
public void actionPerformed(ActionEvent arg0) {
System.out.println("actionPerformed is invoked.....");
}
}

Constructor [] cons = cc.getConstructors();
ExFrame ef = (ExFrame)cons[0].newInstance(new JPanel(), new Integer(20));

六、通过反射可以访问对象的私有属性吗?

访问权限对java虚拟机都是无效的,对于私有属性而言,反射是可以访问到的;
Field f = c.getDeclaredField("name");
f.setAccessible(true);//私有属性必须加上这个才有效
System.out.println("obj name is: "+f.get(obj));

同样对私有成员方法有效:m.setAccessible(true);
对于私有构造方法同样有效,con.setAccessible(true);
构造方法为私有的就不能在外部new它的实例,但是通过反射可以;
分享到:
评论

相关推荐

    最全面的java反射总结

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心在于`java.lang.Class`类以及相关的类和接口,如`java.lang.reflect`包下...

    java反射总结

    个人学习总结,java反射,思维导图 个人学习总结,java反射,思维导图

    JAVA中的反射机制(内含大量实例).doc

    下面将详细介绍Java反射机制的基本概念、工作机制及其应用。 #### 1. 检测类 **1.1 reflection的工作机制** 为了理解反射的工作原理,我们可以从一个简单的示例开始。下面的代码展示了如何使用Java反射API来获取...

    java中反射知识总结

    下面我们将深入探讨Java反射的核心知识点。 1. **Chp16** - 可能指的是某个教程或书籍中的第16章,专门讲解反射。在Java中,反射通常被视为高级主题,涉及JVM(Java虚拟机)和元数据的交互。通过Java.lang.Class类...

    java反射,获取所有属性、方法以及List集合类

    总结来说,Java反射提供了一种动态操控Java对象的能力,允许我们在运行时发现和改变类的行为。虽然它强大且灵活,但也应谨慎使用,因为它可能会降低代码的可维护性和安全性。在实际开发中,反射常用于框架、插件系统...

    java反射机制原理和反射机制总结

    总结,Java反射机制是Java平台灵活性和动态性的体现,它极大地扩展了Java程序的能力,但同时也需要谨慎使用,平衡好其带来的便利和潜在问题。学习和理解反射机制对于深入理解Java以及开发复杂系统至关重要。

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    java 反射得到某个方法

    总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取方法,最后使用`invoke()`执行方法。在实际开发中,理解并谨慎使用反射,能够...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    Java反射经典实例

    总结,Java反射机制提供了对运行时类信息的强大访问能力,虽然存在潜在的风险,但在许多场景下,如框架开发、动态代理、元编程等,它的优势是无可替代的。学习和熟练掌握Java反射,能够显著提升编程的灵活性和解决...

    Java反射机制学习总结

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 ...总结而言,Java反射机制是构建灵活、可扩展应用程序的强大工具。然而,在使用反射时,开发者应当权衡其带来的好处和潜在的风险,确保合理有效地利用这一特性。

    java反射总结实例详解

    Java反射是Java语言的一种强大的特性,它允许程序在运行时检查和操作类、接口、对象以及它们的属性和方法。本文将深入探讨Java反射的概念,通过实例解析如何使用反射来获取对象属性值,并介绍Class类、基本数据类型...

    Java反射总结:入门进阶到使用

    本文将从基础到进阶,全面总结Java反射的使用。 **一、反射初识** 反射的核心在于Java运行时能动态地获取类的信息,包括类名、属性、方法、构造器等。通常,我们创建对象是通过类名直接new,而反射则是通过字符串...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    JAVA反射知识总结

    JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...

    JAVA反射知识点总结

    本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。 文章目录一.反射的基本概念二.反射常用类三.使用反射的基本步骤四.Class类讲解(1)Class类是反射机制的起源和入口(2)Class类存放类的结构信息(3)...

    JAVA 反射详解PPT

    总结来说,Java反射机制提供了强大的动态性,使得程序员可以在运行时动态地操作类和对象,而动态代理则进一步扩展了这一能力,允许我们在调用方法前后期添加自定义逻辑。虽然反射和动态代理增加了程序的复杂性,但在...

Global site tag (gtag.js) - Google Analytics