`

Java反射机制中常用API

    博客分类:
  • Java
阅读更多
Class是Reflection故事起源。针对任何您想探勘的class,唯有先为它产生一个Class object,接下来才能经由它唤起为数十多个的Reflection APIs。首先看看Class,反射的核心类,所有的操作都是围绕该类来生成的。
Java允许我们从多种管道为一个class生成对应的Class object:
 //运用Class.forName()
	Class c1 = Class.forName("java.lang.String");
	
	//运用getClass(),每个object都有此方法
	String str = "abc";
	Class c2 = str.getClass();
	
	//运用getSuperclass(),每个class对象都有此方法
	Button b = new Button();
	Class c3 = b.getClass();
	Class c4 = c3.getSuperclass();
	
	//运用.class 語法
	Class c5 = String.class;
	Class c6 = Integer.class;//java.lang.Integer
	Class c7 = java.awt.Button.class;
	Class c8 = int.class;//Integer.TYPE==int.class
	Class c9 = int[].class;
	
	//运用primitive wrapper classes(原始包装类)的TYPE语法
	Class c10 = Integer.TYPE;//表示基本类型int的Class实例,与int.class返回结果一样
	Class c11 = Byte.TYPE;
	Class c12 = Character.TYPE;
	Class c13 = Short.TYPE;
	Class c14 = Boolean.TYPE;
	Class c15 = Long.TYPE;
	Class c16 = Float.TYPE;
	Class c17 = Double.TYPE;
	Class c18 = Void.TYPE;

以下是反射的一个入门级的类:
package com.web.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectionUtil {
	
	public String name = "Gerry";
	public int age = 22;
	public Integer rank = 10;
	private int a = 1;
	
	public ReflectionUtil(){
	}
	
	public ReflectionUtil(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public String toString(){
		return this.name + " : " + this.age;
	}
	
	public String say(String s){
		System.out.println(s);
		return this.toString();
	}
	
	public void sayy(){
		System.out.println("无参");
	}
	
	public static void say(){
		System.out.println("静态方法调用时,不需要传一个对象");
	}

	/**
	 * 运行时生成instance,无参构造
	 */
	public void testConstrutor() throws Exception{
		Class c = Class.forName("com.web.util.ReflectionUtil");
		Object obj = c.newInstance();
		System.out.println(obj.toString());
		
		//类的一些信息
		int flag = c.getModifiers();//表示该类修饰符的 int
		Package pack = c.getPackage();
		System.out.println("包名:"+pack.getName());//包名
		System.out.println(c.getName());//类的完整类名
		System.out.println("类修饰符:"+Modifier.toString(flag));//类修饰符
		System.out.println("是否接口:"+Modifier.isInterface(flag));//是否接口
	}
	
	/**
	 * 运行时生成instance,有参数的构造
	 */
	public void testConstrutorByArgs() throws Exception{
		Class c = Class.forName("com.web.util.ReflectionUtil");
		Class[] ptypes = new Class[]{String.class,int.class};//Class[] ptypes = {String.class,Integer.TYPE};
		Constructor ctor = c.getConstructor(ptypes);
		Object[] arg = {"HaiMei",23};
		Object obj = ctor.newInstance(arg);
		System.out.println(obj.toString());
	}
	
	/**
	 * 运行时调用method,有参数
	 */
	public void testMethodByAgrs() throws Exception{
		Class c = Class.forName("com.web.util.ReflectionUtil");
		Class ptypes[] = {String.class};
		Method m = c.getMethod("say", ptypes);
		ReflectionUtil obj = new ReflectionUtil();
		obj.name = "Gerry";
		obj.age = 40;
		
		Object[] arg = {"invoke say()"};
		Object r = m.invoke(obj, arg);
		System.out.println((String)r);
	}
	
	/**
	 * 运行时调用method,无参数
	 */
	public void testMethod() throws Exception{
		Class c = Class.forName("com.web.util.ReflectionUtil");
		Class ptypes[] = {};
		Method m = c.getMethod("sayy", ptypes);
		ReflectionUtil obj = new ReflectionUtil();
		Object[] arg = {};
		Void v = (Void) m.invoke(obj, arg); //返回值为void时
	}
	
	/**
	 * 运行时调用静态method,invoke时不需要传一个对象
	 */
	public void testMethodStatic() throws Exception{
		Class c = Class.forName("com.web.util.ReflectionUtil");
		Class ptypes[] = {};
		Method m = c.getMethod("say", ptypes);
		Object[] arg = {};
		m.invoke(null, arg);
	}
	
	/**
	 * 获取Field值、设置field值
	 */
	public void testField() throws Exception{
		ReflectionUtil obj = new ReflectionUtil();
		Class c = obj.getClass();
		Field f = c.getField("name");
		System.out.println(f.getName());
		System.out.println(f.getGenericType());//返回一个 Type 对象,该字段的声明类型
		System.out.println(f.getType());//返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型
		System.out.println((String)f.get(obj));
		f.set(obj, "Bruce");
		System.out.println((String)f.get(obj));
		
		f = c.getField("age");
		System.out.println((Integer)f.get(obj));
		f.set(obj,24);
		System.out.println((Integer)f.get(obj));
	}
	
	/**
	 * 访问Field内容
	 */
	public void testFields() throws Exception{
		ReflectionUtil r = new ReflectionUtil(); 
		Class c = r.getClass();   
		
		System.out.println("反射类中所有公有的属性:");   
		Field[] fPublic =c.getFields();//只能获取反射类中所有公有属性  
		for(int i=0; i<fPublic.length; i++){   
			Class cc = fPublic[i].getType();   
			System.out.println("fPublic:"+cc);   
		}
		
		System.out.println("反射类中所有的属性(当然也包括私有的属性):");   
		Field[] fAll = c.getDeclaredFields();//可以获取反射类中所有的属性  
		for(int i=0; i<fAll.length; i++){   
			Class cl = fAll[i].getType();   
			System.out.println("fAll:"+cl);   
		}   
		
		System.out.println("反射类中私有属性的值:");   
		Field f = c.getDeclaredField("a");   
		f.setAccessible(true);   
		Integer i = (Integer)f.get(r);   
		System.out.println(i);   
	}
	
	/**
	 * 获取参数类型Class[]的方法  
	 */ 
	public Class[] getMethodClass(String[] type){
		Class[] c = new Class[type.length];
		for(int i=0; i<c.length; i++){
			if(!type[i].trim().equals("") || type[i] != null){
				if(type[i].equals("int") || type[i].equals("Integer")){
					c[i] = Integer.TYPE;
				}else if(type[i].equals("float") || type[i].equals("Float")){
					c[i] = Float.TYPE;
				}else if(type[i].equals("double") || type[i].equals("Double")){
					c[i] = Double.TYPE;
				}else if(type[i].equals("boolean") || type[i].equals("Boolean")){
					c[i] = Boolean.TYPE;
				}else{
					c[i] = String.class;
				}
			}
		}
		return c;
	}   
	
	/**
	 * 获取参数Object[]的方法
	 */   
	public Object[] getMethodObject(String[] type, String[] param){
		Object[] obj = new Object[param.length];
		for(int i=0; i<obj.length; i++){
			if(param[i] != null || !param[i].trim().equals("")){
				if(type[i].equals("int") || type[i].equals("Integer")){
					obj[i] = new Integer(param[i]);
				}else if (type[i].equals("float") || type[i].equals("Float")){
					obj[i] = new Float(param[i]);
				}else if (type[i].equals("double") || type[i].equals("Double")){
					obj[i] = new Double(param[i]);
				}else if (type[i].equals("boolean") || type[i].equals("Boolean")){
					obj[i] = new Boolean(param[i]);
				}else{
					obj[i] = param[i];
				}
			}
		}
		return obj;
	}   
}
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    Java 1.6 API 中文 New

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    Java SE编程入门教程 java反射机制(共16页).pptx

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    JavaAPI1.6中文chm文档 part1

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    Java SE编程入门教程 java 常用API(共22页).pptx

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    java api最新7.0

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,...

    JavaAPI中文chm文档 part2

    java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类...

    java jdk-api-1.6 中文 chmd

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

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

    未经允许禁止转载,转载请联系作者。 目录 一 反射(Reflect)初识 二 反射的基本使用和常用API 2.1 基本使用 2.2 反射获取一个对象的步骤 2.3 反射常用API 2.3.1 获取反射中的Class对象 ...4.1 Java反射机制的起源

    java_diary_18.rar_JFC_swing_反射机制_国际化 java

    Day07:反射机制与内部类 Day08:异常与Swing图形界面 Day09:swing图形界面与AWT事件模型 Day10:JFC基础类库(具体类查看API) Day11:多线程-进程与线程及方法 Day12:线程机制与I/O流的方法 Day13:I/O流的类与...

    反射常用方法整理(xmind)

    整理的Java反射的常用的一些方式,采用xmind的形式整理出来。希望有能够用到的。将java代码的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,这就是java的反射机制;

    Java SE编程入门教程 java判断循环(共79页).ppt

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    Java SE编程入门教程 java泛型(共11页).pptx

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    Java SE编程入门教程 java序列化(共14页).pptx

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    Java开发常用jar包

    1.commons-beanutils.jar:提供对Java反射和自省API的包装,主要提供了对于 JavaBean进行各种操作。提供了对于JavaBean进行各种操作,克隆对象,属性等等. 2.commons-digester.jar:方便地将XML文档所定义的元素转化为...

    Java SE编程入门教程 properties(共3页).pptx

    java反射机制(共16页) java泛型(共11页) java封装继承多态(共56页) java集合(共38页) java接口(共21页) java类和对象方法以及包的使用(共56页) java类和对象方法以及包的使用(共62页) java判断循环...

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

    DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....

Global site tag (gtag.js) - Google Analytics