`
leihongtai2010
  • 浏览: 14275 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java反射机制及简单实现

阅读更多
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反射机制的简单理解

    有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:

    JAVA反射实现和实现机制

    JAVA反射PPT,,简单介绍反射的实现和机制,

    java注解、java反射机制 jdbc 封装

    该案例实现jdk1.5新特性:java注解和java反射机制加上jdbc API综合运用的一个案例,实现了数据库的简易封装,对想了解jdk的反射机制,注解有帮助

    利用java反射机制实现自动调用类的简单方法

    下面小编就为大家带来一篇利用java反射机制实现自动调用类的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java反射机制详解

    主要介绍了Java反射机制,首先简单介绍了反射机制的预备知识,进一步分析了Java反射机制的原理、实现技巧与应用方法,需要的朋友可以参考下

    使用Java反射实现一个简单的日志记录器.txt

    这段代码实现了一个简单的日志记录器LoggerUtil,其中使用了Java的反射机制。在类的构造方法中,创建了一个Logger对象来记录日志信息。然后定义了两个静态方法logInfo()和logError(),分别用于记录不同级别的日志。...

    Qt 反射机制实现,通过类名创建对象

    反射是指程序在运行时动态获取对象属性与...简单一点说,就是可以通过类名称来创建一个类对象,这在Java和Object-C中是原生支持的,所以实现起来非常简单,但是C++就不支持了,如果想要用到反射机制,那就得自己实现。

    反射机制demo

    java反射机制的简单例程,实现了动态修改对象私有属性值··

    java 利用java反射机制动态加载类的简单实现

    下面小编就为大家带来一篇java 利用java反射机制动态加载类的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    文本数据库的简单java实现

    1.这个是一个文本数据库简单的实现思路, 的完整java代码工程. 2.自己平时写些小程序,存储数据使用那些收钱/开源的...4.其中使用到了java泛型,java反射机制,文本输入输出等技术,如果想研究这些技术也可以参考这些代码.

    Java反射机制的原理及在Android下的简单应用

    在Java中的反射机制,被称为Reflection。(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了。)它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。Reflection机制允许程序在正在...

    JAVA Reflection(反射机制)

    Java 反射机制  反射机制简介  反射机制应用示例  简单的Ioc实现  代理模式  Java动态代理  简单的Aop实现  “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl...

    java反射简单实例

    主要介绍了java反射机制,以一个简单实例形式分析了Java反射的原理与实现技巧,需要的朋友可以参考下

    java反射机制

    介绍了发射的基本原理,实现反射的几种方法并附上简单的例子介绍了反射实现过程,可以参照实例对照前面讲的原理对反射有一个整体了解

    手写IOC项目,学习理解Spring IOC原理

    我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,必须掌握反射的实践方法。Java反射机制是在运行状态中,对于...资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。

    Java反射的简单使用

    先来一些不太实用的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java...

    KMeans算法的Java实现及Python实现.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java垃圾回收算法的简易模拟实现.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

Global site tag (gtag.js) - Google Analytics