Java反射机制

作者: 低吟浅唱1990 | 来源:发表于2016-04-05 14:29 被阅读63次

缘起

最近在学习Java语言,所以相比较一下Java和Objective-c的反射机制的用法。什么是反射?
简单的说就是程序在运行时能够获取某个特定类的信息。只要给定类的名字,那么就可以通过反射
机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可
在运行时创建对象、修改属性(包括私有的)、调用方法等。

Java

Java反射机制主要提供以下功能:
<ol>
<li>在运行时判断任意一个对象所属的类</li>
<li>在运行时构造任意一个类的对象</li>
<li>在运行时获取任意一个类所具有的成员变量和方法</li>
<li>在运行时调用任意一个对象的方法</li>
</ol>
在java.lang.refelect包下
<ol>
<li>Fiele类:代表类的成员变量</li>
<li>Method类:代表类的方法</li>
<li>Constructor类:代表类的构造方法</li>
</ol>

Class 对象是反射的起源,一切从Class对象开始。获取Class对象的方式

获取方式 说明 示例
Object.getClass() 获取指定示例的Class String str = "abc";Class c1 = str.getClass()
.class 直接获取当前 Class listClass = ArrayList.class
Class.forName() 传入类的路径 或者全称 Class c = Class.forName("java.lang.String");
Primitive.TYPE 基本数据类型的包装获取 Class longClass = Long.TYPE

例子:
<pre>
class Jober{
private String name;
private int age;
public String getName() {
return name;
}
public Jober() {
System.out.println("heheheh");
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Jober(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String toString() {
return "Jober [name= "+ name +", age= "+age+ "]";
}
}
</pre>

1.要获取上面类的信息

<pre>
//获取类型
import java.lang.reflect.*;
public class Reflection {
public static void main(String[] args) {
try {
//获取Jober对象
Class<?> class1 = Class.forName("com.wanlian.douya.javal.Jober");
Jober jober = new Jober("zhangsna",13);
Class<?> class2 = jober.getClass();
Class<?> class3 = Jober.class;
Class<?> class4 = int.TYPE; //获取基本数据类型
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
</pre>

2.获取方法

<pre>
Class<?> class1 = Class.forName("com.wanlian.douya.javal.Jober");
Method []m = class1.getDeclaredMethods();
for (Method method : m) {
System.out.println(method.toString());
}
//public java.lang.String com.wanlian.douya.javal.Jober.toString()
//public java.lang.String com.wanlian.douya.javal.Jober.getName()
//public void com.wanlian.douya.javal.Jober.setName(java.lang.String)
//public int com.wanlian.douya.javal.Jober.getAge()
//public void com.wanlian.douya.javal.Jober.setAge(int)
</pre>

3.获取属性(成员变量)

<pre>
import java.lang.reflect.*;
public class Reflection {
public static void main(String[] args) {
try {
Class<?> class1 = Class.forName("com.wanlian.douya.javal.Jober");
Field []fields = class1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.toString());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
//两个成员变量
//private java.lang.String com.wanlian.douya.javal.Jober.name
//private int com.wanlian.douya.javal.Jober.age
</pre>

4.获取构造方法

<pre>
Constructor<?> []constructors = class1.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.toString());
}
//声明的两个构造方法 一个无参数,一个有参数的
//public com.wanlian.douya.javal.Jober(java.lang.String,int)
//public com.wanlian.douya.javal.Jober()
</pre>

5.获取指定方法并调用

<pre>
//获取Class类
Class<?> class1 = Class.forName("com.wanlian.douya.javal.Jober");
//获取指定的构造方法
Constructor<?> constructor = class1.getDeclaredConstructor(new Class[]{});
//创建一个实例对象
Jober jober = (Jober)constructor.newInstance(new Object[]{});
//获取指定的方法
Method method =class1.getDeclaredMethod("setName",new Class[]{String.class});
System.out.println(method.toString());
//调用改方法
method.invoke(jober, new Object[]{"zhangsan"});
System.out.println(jober.getName());
</pre>

相关文章

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

网友评论

    本文标题:Java反射机制

    本文链接:https://www.haomeiwen.com/subject/ftyplttx.html