Java反射


本人菜鸟一枚,对于学到的东西总爱记录下来,这里贴出一些java反射相关的知识

首先是class对象,对于加载到内存中的任何一个类,虚拟机都会在加载类的同时,创建一个class对象与该类对应,这个class对象中保存了这个类的信息。

获取class对象:(Class类在java.lang包中,可以通过查看API了解其用法)

//		第一步,获取class对象
//		Demo d=new Demo();//自定义的类
//		Class clazz=d.getClass();//第一种
//		Class clazz=Demo.class;//第二种
//		Class clazz=Class.forName("reflect.Demo");//第三种
//		System.out.println(clazz);
java.lang.reflect包下有三个反射相关的类Constructor(对应类的构造函数),Field(对应类中的属性),Method(对应类中的方法),通过这三个类可以得到类的属性和方法等信息。下面介绍如何使用它们

//获取类的构造函数
//		public Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException这个方法可以获得类的公共构造//函数
//		public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException这个方法可以获取所有//构造函数,包括私有的
//		这里要说明的是Class<?>... parameterTypes是个可变参数,即参数的个数是可变的,这是jdk5的新特性
//		Constructor constructor1=clazz.getConstructor();//获取无参的构造函数
//		Constructor constructor2=clazz.getConstructor(int.class);//获取有参的构造函数
//		Constructor constructor3=clazz.getDeclaredConstructor(int.class,String.class);//获取私有的构造函数
//		Constructor[] constructors=clazz.getConstructors();//获取所有公共的构造函数
//		for(Constructor con:constructors){
//			System.out.println(con);
//		}
//		Constructor[] constructors1=clazz.getDeclaredConstructors();//获取所有的构造函数,包括私有的
//		for(Constructor con:constructors1){
//			System.out.println(con);
//		}
接下来就可以利用这些构造函数做一些事情了,比如创建一个类的实例

//		Demo d=(Demo) constructor1.newInstance();
//		d.show();
//		Demo d1=(Demo)constructor2.newInstance(22);
//		System.out.println(d1.getAge());
//		constructor3.setAccessible(true);//constructor3是个私有构造函数,要先把它设置为true,取消java的语法检查
//		Demo d2=(Demo)constructor3.newInstance(22,"flying");
//		System.out.println(d2.getAge());//看看,通过反射机制,连私有的构造函数都可用了,然而反射的功能不只在这,它主要是可以动态获取类的信息,接触过框架的同学应该知道
//		获取类的方法,和获取构造函数类似
//		Method m1=clazz.getMethod("show");
//		Method m2=clazz.getDeclaredMethod("show1", String.class);
//		Method[] m3=clazz.getMethods();
//		Method[] m4=clazz.getDeclaredMethods();
//		调用方法
//		Demo demo=new Demo();
//		m1.invoke(demo);
//		m2.setAccessible(true);//和构造函数一样
//		m2.invoke(demo, "helloworld");
//		//获取类的属性
//		Field f1=clazz.getField("name");
//		Field f2=clazz.getDeclaredField("age");
//		Field[] f3=clazz.getFields();
//		Field[] f4=clazz.getDeclaredFields();
//		//为属性设置参数
//		f1.set(demo, "gaohui");
//		System.out.println(demo.name);
//		f2.setAccessible(true);
//		f2.set(demo, 22);
//		System.out.println(demo.getAge());
最后贴出我Demo类的代码
package reflect;

public class Demo {
	
	private int age;
	public String name;
	public Demo(){
		System.out.println("默认构造函数");
	}
	public Demo(int age){
		this.age=age;
	}
	private Demo(int age,String name){
		this.age=age;
		this.name=name;
	}
	public int getAge(){
		return age;
	}
	public void setName(String name){
		this.name=name;
	}
	public void show(){
		System.out.println("这里是测试方法");
	}
	private void show1(String message){
		System.out.println(message);
	}
}

第一次写,写的不好,哈哈哈








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值