码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA-反射

时间:2015-04-02 10:29:49      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:反射   java   

JAVA中都是对象,因此即便是我们用的类也应该是一个类的对象,这个类就是Class,即类类型.java.lang.Class

一. 类加载时机

编译时静态加载类

1) new 创建对象是静态加载类 编译时刻就需要加载所有可能使用到类

2) 但是需求可能是按需加载.同时全部加载太耗费资源. 同时接收的时候用一个通用接口 eg:office这个接口,,Word Excel 继承.那么通过反射就能接收.

功能性类尽量使用动态加载 减少编译,只用添加新写的类满足接口即可

Note:每个类加载只有一个,并不像普通对象可以有多个.

生成类类型/通过类类型生成类


基本的数据类型,void关键字等都存在类类型
Class c = 基类.class (int,String,double,void等)
二、Class类的基本API操作的
1、c.getName()可以获取类的名称
2、c.getSimpleName();//不包含包名的类的名称
3、c.getMethods()获取类的【public方法】集合,【包括继承来的】
***注意【所有方法都是Method类的对象】
4、c.getDeclaredMethods()获取的是所有该类【自己声明】的方法,【不问访问权限】
三、Method类提供了一些操作方法的方法。。。
1、.getReturnType()得到该方法的返回值类型的类类型(class),如int.class String.class
2、.getName()得到方法的名称
3、.getParameterTypes()获得参数列表类型的类类型,如参数为(int,int)则得到(int.class ,int class)

Java反射机制——获取成员变量&构造函数
一、成员变量是java.lang.reflect.Field的对象
1、Field类封装了关于成员变量的操作
2、Field[] fs = c.getFields()方法获取所有public的成员变量Field[]信息
3、c.getDeclaredFields获取的是该类自己声明的成员变量信息
4、field.getType()获得成员类型的类类型
5、field.getName()获得成员的名称
二、构造函数是java.lang.Constructor类的对象
1、通过Class.getConstructor()获得Constructor[]所有公有构造方法信息
2、建议getDeclaredConstructors()获取自己声明的构造方法
3、Constructor.getName():String
4、Constructor.getParameterTypes():Class[]


package MVCTest;

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

/*
 * 万事万物皆对象
 * 所有的类都是Class的对象(那Class是谁的对象?算了...)
 * Class 为类类型
 * 那有了类就有生成对象即生成Class类的对象
 * 
 */
public class Test {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		// TODO Auto-generated method stub
		Test t = new Test();
		Class c1 = Test.class;//根据类对象获得Class类
		Class c2 = t.getClass();//根据实例对象获得Lcass类
		Class c3 = Class.forName("MVCTest.Test");//静态方法通过全部路径获得
		Test tt = (Test)c3.newInstance();//生成类的对象
		System.out.println(c1==c2);
		System.out.println(c2==c3);//都是True,一个类只有一个
		
		
		getMethod(new String("hello"));//获取方法信息
		getField(new  String("hello"));//获取成员信息
		getConstructor(new  String("hello"));//获取构造函数信息
	}

	private static void getMethod(Object obj) {
		//
		Class c4 = obj.getClass();
		Method [] method = c4.getMethods();
		for(Method m:method){
			//getReturnType()是类类型名 即int.class
			System.out.print(m.getReturnType().getName()+" "+m.getName()+"(");
			Class [] cc = m.getParameterTypes();
			for(Class ccc:cc){
				System.out.print(ccc.getName()+",");
			}
			System.out.println(")");
		}
	}
	private static void getConstructor(Object obj) {
		//传的参数obj类型就是自己本身的类型,只不过用父类接收
		Class c4 = obj.getClass();
		Constructor [] constructor = c4.getDeclaredConstructors();
		for(Constructor c:constructor){
			//getReturnType()是类类型名 即int.class
			System.out.print(c.getName()+"(");
			Class [] cc = c.getParameterTypes();
			for(Class ccc:cc){
				System.out.print(ccc.getName()+",");
			}
			System.out.println(")");
		}
	}
	private static void getField(Object obj) {
		//获取方法信息
		Class c4 = obj.getClass();
		Field [] field = c4.getDeclaredFields();
		for(Field f:field){
			//getReturnType()是类类型名 即int.class
			System.out.println(f.getType().getName()+" "+" "+f.getName());
			
		}
	}

}


JAVA-反射

标签:反射   java   

原文地址:http://blog.csdn.net/gg_gogoing/article/details/44827889

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!