`
jiauwu
  • 浏览: 83396 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA反射

阅读更多

摘、学自:API + http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html

JAVA反射

Java反射是Java被视为动态语言的一个关键性质。它允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(如public, static .. )、superclass(如Object .. )、实现的interfaces(如Cloneable .. ),也包括fields和methods的所有信 息,并可于运行时改变fields内容或调用methods。

 

具体功能

  1. 获取类的Class 对象
  2. 获取类的Fields
  3. 获取类的Method
  4. 获取类的Constructor
  5. 新建类的实例 ( Class<T>的函数 newInstance 通过Constructor 对象的方法 newInstance )
  6. 调用类的函数 ( 调用private 函数 )
  7. 设置/ 获取类的属性值 ( private属性 )
  8. 动态创建代理类

示例

父类:PersonPo

package javas.reflectss;

/**
 * 父类
 * @author Hust
 * @Time 2011-11-3
 */
public class PersonPo {

	private String name;
	private String pass;
	
	public PersonPo() {
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

}

子类UserPo

package javas.reflectss;

/**
 * 测试的类
 * 
 * @author Hust
 * @Time 2011-11-3
 */
public class UserPo extends PersonPo {
 
	private int id;
	float height;
	protected double weight;
	public boolean active;

	public UserPo() {
	}
	
	public UserPo(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public float getHeight() {
		return height;
	}

	public void setHeight(float height) {
		this.height = height;
	}

	public double getWeight() {
		return weight;
	}

	public void setWeight(double weight) {
		this.weight = weight;
	}

	public boolean isActive() {
		return active;
	}

	public void setActive(boolean active) {
		this.active = active;
	}

	public void print(){
		System.out.println("in UserPo.java print method ");
	}

	public void print(String s){
		System.out.println("in UserPo.java print method String s " + s);
	}
	
	public void print(String s,String t){
		System.out.println("in UserPo.java print method " + s + t);
	}

	public void print(String ... s){
		System.out.println("in UserPo.java print method  String ... s" + s);
	}
	
}

 另一测试类UserClass

package javas.reflectss;

/**
 * 测试
 * @author Hust
 * @Time 2011-11-3
 */
public class UserClass {

	public int id;
	public String class_name;
	public int class_code;

	public UserClass() {
	}
	
	public UserClass(int id,String name,int node) {
		this.id = id;
		this.class_name = name;
		this.class_code = node;
		testPrivateM();
	}

	/**
	 * private
	 */
	private void testPrivateM(){
		System.out.println("in testPrivateM" + id + class_name+class_code);
	}

	/**
	 * proteced
	 */
	protected void testProtectedM(){
		System.out.println("in testProtectedM" + id + class_name+class_code);
	}
	
	/**
	 * public
	 */
	protected void testPublicM(){
		System.out.println("in testPublicM" + id + class_name+class_code);
	}
	
}

反射测试类ReflectionTest

package javas.reflectss;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 反射测试 
 * @author Hust
 * @Time 2011-11-3
 */
public class ReflectionTest {

	public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		testFieldMethodConstractor();//取其中变量、方法、构造方法
		//callMethod();//调用方法
		//setGetFiled();//设置/获取类的属性值
	}
	
	/**
	 * 设置/获取类的属性值
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 */
	public static void setGetFiled() throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException{
		Class<UserClass> userClass = UserClass.class;
		UserClass po = userClass.newInstance();
		Field intField = userClass.getDeclaredField("id");
		intField.set(po, 100);
		int getValue = intField.getInt(po);
		System.out.println(getValue);
		
	}
	
	/**
	 * 调用方法
	 * @throws NoSuchMethodException 
	 * @throws SecurityException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 */
	public static void callMethod() throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		Class<UserPo> userPo = UserPo.class;
		UserPo inst = userPo.newInstance();//会调用对象的默认构造器
		System.out.println("实例:"+inst);
		Method m = userPo.getDeclaredMethod("print", (Class[]) null);
		Method m2 = userPo.getMethod("print", String.class); //参数为String
		Method m3 = userPo.getMethod("print", String.class,String.class); //参数为String,String
		Method m4 = userPo.getDeclaredMethod("print", String[].class);
		m.invoke(inst, null); //调用print()方法
		m2.invoke(inst, "123"); //调用print(String)方法
		m3.invoke(inst, "456","789"); //调用print(String,String)方法
		m4.invoke(inst, new Object[]{new String[]{"123","456"}}); //调用print(String[])方法
		
		Class<UserClass> userClass = UserClass.class;
		//UserClass po = userClass.newInstance();
		Constructor<?> co = userClass.getConstructor(int.class,String.class,int.class);
		Object o = co.newInstance(1,"234",5);
		Method mc = userClass.getDeclaredMethod("testPublicM");
		//mc.setAccessible(true);
		mc.invoke(o, null); //调用构造方法(int,String,int)
	}
	
	/**
	 * 取其中变量、方法、构造方法
	 * @throws NoSuchFieldException 
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * @throws ClassNotFoundException 
	 */
	public static void testFieldMethodConstractor() throws SecurityException, NoSuchFieldException, NoSuchMethodException, ClassNotFoundException{
		//获得基本类型的类信息
		//Class<UserPo> userPo = UserPo.class;// 1
		//UserPo po = userPo.newInstance();po.setActive(true);
		Class<?> userPo = Class.forName("javas.reflectss.UserPo"); // 2
		//Class<?> bb = Boolean.TYPE;//boolean 3
		
		System.out.println("====getDeclaredFields = Class对象所表示的类或接口的所有字段=");
		Field[] fields = userPo.getDeclaredFields(); 
		for(Field f : fields){
			System.out.println(f);
			/*  打印结果
			 	private int javas.reflectss.UserPo.id
				float javas.reflectss.UserPo.height
				protected double javas.reflectss.UserPo.weight
				public boolean javas.reflectss.UserPo.active
			 * */
		}
		System.out.println("====getDeclaredField = Class对象所表示的类或接口的指定字段=");
		Field fieldsd = userPo.getDeclaredField("height"); 
		//取相应的类型
		System.out.println(fieldsd.getGenericType());//float
		System.out.println(fieldsd.getGenericType().toString().equals("float"));//true
		System.out.println("====getFields = Class对象所表示的类或接口所声明的所有可访问公共字段=");
		Field[] fieldss = userPo.getFields(); 
		for(Field f : fieldss){
			System.out.println(f);//public boolean javas.reflectss.UserPo.active
		}
		
		System.out.println("====getMethods = Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member方法=");
		Method[] methods = userPo.getMethods(); 
		for(Method m : methods){
			System.out.println(m);
			/*  所有公共方法
				public int javas.reflectss.UserPo.getId()
				public void javas.reflectss.UserPo.print(java.lang.String,java.lang.String)
				public void javas.reflectss.UserPo.print(java.lang.String)
				.....
				public java.lang.String javas.reflectss.PersonPo.getName() //父类的方法
				public void javas.reflectss.PersonPo.setName(java.lang.String)
				public java.lang.String javas.reflectss.PersonPo.getPass()
				public void javas.reflectss.PersonPo.setPass(java.lang.String)
				public native int java.lang.Object.hashCode()
				public final native java.lang.Class java.lang.Object.getClass()		
			 */
		}
		System.out.println("====getDeclaredMethods = Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法=");
		Method[] methodss = userPo.getDeclaredMethods(); 
		for(Method m : methodss){
			System.out.println(m);
			/*  仅公共方法
				public int javas.reflectss.UserPo.getId()
				public void javas.reflectss.UserPo.print(java.lang.String,java.lang.String)
				public void javas.reflectss.UserPo.print(java.lang.String)
				.....
				public void javas.reflectss.UserPo.print(java.lang.String)
			 */
		}
		System.out.println("====getDeclaredMethods=Class对象所表示的类或接口的指定已声明方法");
		Method methodsms = userPo.getDeclaredMethod("getHeight", (Class[]) null); 
		System.out.println(methodsms);//public float javas.reflectss.UserPo.getHeight()
		
		System.out.println("====使用getConstructors获取构造器 ");
		Constructor<?>[] constructors = userPo.getConstructors();
		for (Constructor<?> m : constructors){
			System.out.println(m);
			/*
			 	public javas.reflectss.UserPo(int)
				public javas.reflectss.UserPo()
			 **/
		}
		
	}
	
}

 

打印结果及说明见注释。

 

 

 

 

 


分享到:
评论
1 楼 jiauwu 2011-11-05  
发了才发现,父类与子类的设计太差劲了。只是当学习反射随便做的例子吧。

相关推荐

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

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

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    java 反射得到某个方法

    在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    java反射-英文版反射规范

    ### Java反射机制详解 #### 一、概述 Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    java 反射机制例子

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

    java 反射 报错 no such method exception

    ### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....

    java反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    利用java反射将json字符串转成对象.zip

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    java反射

    ### Java反射机制详解 #### 一、引言 在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时访问类的信息,并能够动态地创建对象、调用方法以及获取字段值等。这种能力对于框架设计、代码...

Global site tag (gtag.js) - Google Analytics