JAVA反射机制的学习

1、反射的基本概念

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2、反射的基本功能

  1.     可以通过反射取得一个类的实例化对象。
  2.     可以通过反射取得类的结构
  3.     可以通过反射进行属性方法的调用

3、认识反射

    正常情况下,一个类要想使用,则必须找到此类,之后通过此类产生实例化对象,必须先有类再有对象,那么如果现在要想通过一个对象找到其所在的类呢?在反射机制中Class类是一个操作的源头,所有的反射操作从此类展开,但是如果想要实例化此类对象可以通过以下三个途径完成:
  1. 通过Object类中的getClass方法: public  final Class<?> getClass();
  2. 通过类.class的形式:Person.class
  3. 通过类的静态方法:public  static calss<?>  forName(StringclassName) throws ClassNotFoundException

    最常用的是forName方法,其次是类class方法。在Class的使用中实例化对象是最常用的一种操作,而且日后所有的框架的各个程序的实现原理都是依靠Class类完成的。为了开发方便,一定在类中定义无参构造方法。

public class PersonClassDemo {
	//.class方法
	public static void main(String[] args) {
		Person p1=new Person();
		Class<Person> c=(Class<Person>) p1.getClass();
		System.out.println(c.getName());//返回对象为包名.person
	}
}
public class PersonClassDemo3 {
	//验证forName方法
	public static void main(String[] args) {
		Class<?> c=null;
		try {
			c = Class.forName("prc.demo1.Person");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(c.getName());
		
	}
}

4、通过反射实例化属性和方法

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

public class getMethodsDemo1 {

	public static void main(String[] args)throws Exception {
		Class<?> c=Class.forName("prc.demo2.Person");
		System.out.println("------------取得类中所有普通方法名-----------");
		Method m[]=c.getMethods();
		for (int i = 0; i < m.length; i++) {
			System.out.println(m[i]);
		}
		
		System.out.println("------------取得类中所有接口-----------");
		Class<?> inter[]=c.getInterfaces();
		for (int i = 0; i < inter.length; i++) {
			System.out.println(inter[i].getName());
		}
		
		System.out.println("------------取得类中所有父类-----------");
		Class<?> sc=c.getSuperclass();
		System.out.println(sc.getName());
		
		System.out.println("------------取得类中所有构造器-----------");
		Constructor<?> con[]=c.getConstructors();
		for (int i = 0; i < con.length; i++) {
			int mod=con[i].getModifiers();
			String str=Modifier.toString(mod);
			Class<?>[] parm=con[i].getParameterTypes();
			System.out.print(str+" ");
			System.out.print(con[i].getName()+"(");
			for (int j = 0; j < parm.length; j++) {
				System.out.print(parm[j].getName()+","+"arg-"+j);
			}
			System.out.println(")");
		}
		
		System.out.println("------------取得返回值类型、异常、方法名-----------");
		for(int i=0;i<m.length;i++){
			String mod=Modifier.toString(m[i].getModifiers());//取得访问权限
			String metName=m[i].getName();	//取得方法名
			Class<?> ret=m[i].getReturnType();//取得返回值类型
			Class<?> exc[]=m[i].getExceptionTypes();//取得全部异常
			Class<?> parm[]=m[i].getParameterTypes();
			System.out.print(mod+" ");
			System.out.print(ret+" ");
			System.out.print(metName+" ");
			for (int j = 0; j < parm.length; j++) {
				System.out.print(parm[j]+"arg-"+j);
				if(j<parm.length-1){
					System.out.print(",");
				}
			}
		}
		
		System.out.println("------------取得全部变量-----------");
		Field []f=c.getFields();	//取得全部变量
		for (int i = 0; i < f.length; i++) {
			String mo=Modifier.toString(f[i].getModifiers());
			System.out.println(mo);
			System.out.println(f[i].getType().getName());
		}
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值