1、什么是Java的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。(定义来自网络书籍)
2、Java反射中用到的几个对象
在反射实现中主要用到的几个对象Class、Constructor、Field、Method
2.1 Class:对于任何一个你想操作的类对象,首先都须要将它转化成一个CLass对象然后通过一些JDK的API才能进行进一步的操作。
获得Class对象有三种方法:
// 1、通过类来获得Class对象
Class<?> clazz1 = Person.class;
// 2、通过Class.forName(含包路径的类类)获得Class对象;
Class<?> clazz2 = Class.forName("com.leiht.reflect.Person");
// 3、通过类类的一个实例.getClass()获得Class对象
Class<?> clazz3 = new Person().getClass();
2.2 Constructor:帮名思义,此对象是用来获取及操作目标对象的构造方法(包括有参和无参的)
获取Constructor对象:
// 使用无参/默认构造器创建对象实例
Class<?> clazz = Person.class;
Person person = (Person) clazz.newInstance();
System.out.println(person);
//通过Constructor对象实现对构造方法的反射
//如果构造方法为private(单例模式)则用getDeclaredConstructor(...)方法
Constructor<Person> con = (Constructor<Person>) clazz.getConstructor(int.class, String.class, int.class);
2.3 Field:用于对目标对象的属性操作
获取Field对象:
//通过字段名获取公有字段
Field f1 = clazz.getField("id");
2.4 Method对象:此对象是用于获取目标类的方法及其相关的操作
获取Field对象
//通过类类的一个实例.getClass()获得Class对象
Class<?> clazz = person.getClass();
Method m = clazz.getMethod("getAge");
int age = (int) m.invoke(person);
·
3、关于反射的简单实现代码(可参考)
3.1 目标对象
package com.leiht.reflect;
public class Person {
private static String TAG = "Tag";
public int id;
private String name;
private int age;
public Person() {
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int sum(int...numbers) {
if (numbers.length==0) return -1;
int total = 0;
for (int n : numbers)
total += n;
return total;
}
public static String getTAG() {
return TAG;
}
public static void setTAG(String tAG) {
TAG = tAG;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id + this.name + this.age;
}
}
3.2 获取Class对象
package com.leiht.reflect;
import com.leiht.reflect.util.ToStringUtil;
/**
* 取得Class对象的三种方法
*
* @author Leiht
*
*/
public class ReflectClass {
public static void main(String[] args) throws Exception {
// 1、通过类来获得Class对象
Class<?> clazz1 = Person.class;
// 2、通过Class.forName(含包路径的类类)获得Class对象;
Class<?> clazz2 = Class.forName("com.leiht.reflect.Person");
// 3、通过类类的一个实例.getClass()获得Class对象
Class<?> clazz3 = new Person().getClass();
// 三种方式获得的Class对象均是相同的,返回true
System.out.println(clazz1 == clazz2);
System.out.println(clazz2 == clazz3);
System.out.println(ToStringUtil.toString(new Person(1000, "雷洪太", 26)));
}
}
3.3 对构造方法Constructor的操作
package com.leiht.reflect;
import java.lang.reflect.Constructor;
public class ReflectConstructor {
public static void main(String[] args) throws Exception {
// 使用无参/默认构造器创建对象实例
Class<?> clazz = Person.class;
Person person = (Person) clazz.newInstance();
System.out.println(person);
//通过Constructor对象实现对构造方法的反射
//如果构造方法为private(单例模式)则用getDeclaredConstructor(...)方法
Constructor<Person> con = (Constructor<Person>) clazz.getConstructor(int.class, String.class, int.class);
Person p = con.newInstance(100,"lisi",29);
System.out.println(p);
}
}
3.4 对Field的操作
package com.leiht.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ReflectField {
public static void main(String[] args) throws Exception {
Person person = new Person(100, "zhangsan", 18);
//通过类类的一个实例.getClass()获得Class对象
Class<?> clazz = person.getClass();
//通过字段名获取公有字段
Field f1 = clazz.getField("id");
//Field对象
System.out.println(f1);
//通过Field和person实例取值
Object obj1 = f1.get(person);
System.out.println(obj1);
//取得私有字段
Field f2 = clazz.getDeclaredField("name");
System.out.println(f2);
f2.setAccessible(true);
Object obj2 = f2.get(person);
System.out.println(obj2);
Field f3 = clazz.getDeclaredField("age");
System.out.println(f3);
f3.setAccessible(true);
f3.set(person, 20);
Object obj3 = f3.get(person);
System.out.println(obj3);
System.out.println(person.getAge());
//获取静态字段
Field f4 = clazz.getDeclaredField("TAG");
System.out.println(f4);
//判断是否为静态字段
System.out.println("该字段是否是静态字段" + Modifier.isStatic(f4.getModifiers()));
f4.setAccessible(true);
System.out.println(f4.get(null));
System.out.print("设置 : ");
f4.set(null, "new value");
System.out.println(Person.getTAG());
}
}
3.5 对Method的简单操作
package com.leiht.reflect;
import java.lang.reflect.Method;
public class ReflectMethod {
public static void main(String[] args) throws Exception {
Person person = new Person(100, "zhangsan", 18);
//通过类类的一个实例.getClass()获得Class对象
Class<?> clazz = person.getClass();
Method m = clazz.getMethod("getAge");
int age = (int) m.invoke(person);
System.out.println(age);
Method setMethod = clazz.getMethod("setAge", int.class);
setMethod.invoke(person, 28);
System.out.println(person.getAge());
Method arrayMethod = clazz.getDeclaredMethod("sum", int[].class);
int result = (Integer) arrayMethod.invoke(person, new int[]{1,2,3});
System.out.println(result);
}
}
分享到:
相关推荐
下面通过一个简单的示例展示如何使用Java反射机制: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionDemo { public ...
Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...
通过8个demo,你可以逐步深入理解Java反射机制,从简单的获取类信息,到创建对象,调用方法,访问字段,再到处理注解和泛型,全方位掌握这一强大的工具。每个demo都应该设计为解决一个特定的问题,例如如何动态调用...
### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的动态性和灵活性。在这个“利用java反射机制的建议计算器源码”中...
Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...
下面是一个简单的Java反射机制的实现例子: ```java import java.lang.reflect.Field; public class ReflectionExample { private String privateField = "默认值"; public static void main(String[] args) ...
Java 反射机制详解 Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...
### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...
总结来说,Java反射机制为我们提供了动态访问和操作类的能力,可以用来实现对象的深拷贝。然而,反射使用时应谨慎,因为它可能导致性能下降,且容易引入安全隐患。在设计类时,优先考虑使用序列化、克隆或自定义拷贝...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括获取类的信息、创建对象、调用方法以及访问和...
这个例子展示了Java反射机制在分布式计算中的应用,说明了反射在实现远程方法调用方面的重要性。 总的来说,Java反射机制为Java程序提供了高度的灵活性和动态性,在需要动态创建类实例、访问或修改对象属性以及调用...
### Java反射机制简介 #### 一、什么是Java反射机制?...以上是对Java反射机制的简要介绍及示例应用,希望对初学者有所帮助。反射虽然功能强大,但在实际使用时也需要注意其性能开销和安全性问题。
### Java反射机制的原理及在Android下的简单应用 #### 一、Java反射机制的基本概念 反射(Reflection)是指程序在运行时能够访问、检测和修改它自身的能力。这种能力使得程序能够动态地获取自身的结构信息并操作...
文档中提到的“简单C++反射机制(SCR)”是一个基于宏定义、模板和泛型机制的实现方案。通过这种方式,C++程序员可以在不牺牲性能的前提下,为语言添加一定程度的反射能力。 综上所述,C++的反射机制实现需要考虑到...