`

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学习常用API

    在这个“Java学习常用API”中,我们可能会涵盖以下关键知识点: 1. **基础类库**: - **String类**:用于处理文本字符串,提供了大量的操作方法如concat、substring、indexOf等。 - **ArrayList和LinkedList**:...

    java反射机制 字符串——java对象

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

    java开发常用API

    以上只是Java API中的一部分关键知识点,实际开发中还会涉及到更多如XML处理、数据库连接(JDBC)、国际化(java.text包)以及并发工具类等内容。Java API的广泛性和深度使得开发者能够应对各种复杂的编程需求。

    java常用API文档合集

    这份“java常用API文档合集”包含了多个重要的API文档,对于Java和前端开发者来说是宝贵的参考资料。 1. **Java基础API**:Java的基础API包括了`java.lang`、`java.io`、`java.util`等包,它们提供了基本的数据类型...

    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常用API.

    以上就是Java常用API的一些关键知识点,掌握这些基础将有助于你编写更高效、可维护的Java代码。在实际开发中,还需要深入学习异常处理机制、多线程、反射、注解等高级特性,以及框架如Spring、MyBatis等,以提升开发...

    java常用API举例

    8. **反射机制**:Java反射允许程序在运行时检查类、接口、字段和方法的信息,并能动态创建对象和调用方法。例如: ```java Class&lt;?&gt; clazz = Class.forName("java.util.ArrayList"); Object instance = clazz.new...

    Java反射机制

    Java反射机制涉及到的主要API位于`java.lang.reflect`包中,主要包括以下几个类: 1. **Class类**:代表了一个类或接口。每个类都有一个与之对应的Class对象。可以通过Class对象获取类的信息,如字段、方法和构造器...

    高手总结java常用API(免费下载).rar

    6. **反射机制**:Java的反射API允许在运行时动态获取类的信息(如类名、方法名等)并调用其成员。Class类是反射的入口,它代表了Java类的运行时表示。 7. **泛型**:泛型是Java 5引入的新特性,增强了类型安全,...

    java基础语法、面向对象、常用API、反射&集合、IO流&网络编程

    4. **反射**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。这在框架设计、插件系统、元编程等场景下非常有用。反射API包括`java.lang.Class`、`java.lang.reflect....

    java常用API-适合初学者

    本资料“java常用API-适合初学者”旨在帮助初学者快速掌握Java API的基本用法和核心概念。 1. **基础类库** - **Object类**:所有Java类的父类,包含equals()、hashCode()、toString()等方法。 - **String类**:...

    Java api html完整中文版

    Java API中的`java.lang.Thread`和`java.util.concurrent`包提供了多线程支持。开发者可以通过继承`Thread`类或者实现`Runnable`接口来创建并管理线程,`java.util.concurrent`包则提供了高级并发工具,如`...

    javaAPI1.6中文网页版

    Java反射API允许程序在运行时动态地获取类的信息,并对类的对象进行操作。Class类代表类,Method类代表方法,Field类代表字段,Constructor类代表构造器。反射机制在动态代理、插件系统、序列化等方面有广泛应用。 ...

    JAVA-API.rar_Java api文档_java api

    9. **反射机制**:Java的反射机制允许程序在运行时动态地获取类的信息并操作类的对象,`java.lang.reflect`包提供了相关的类和接口。 10. **国际化和本地化**:`java.text`和`java.util.Locale`支持多语言环境,...

Global site tag (gtag.js) - Google Analytics