JAVA中反射机制详解

总结一下java反射,写了一个demo,系统的介绍了下构造器、变量和方法的使用,直接上demo:

目录结构:

可能是我eclipse的原因,lib文件夹下应该是下面的两个和junit相关的jar包。

首先看person类:

package com.gefufeng.bean;

public class Person {
	private int id;
	private String name;
	String job;
	public int age;
	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(int id, String name, String job, int age) {
		super();
		this.id = id;
		this.name = name;
		this.job = job;
		this.age = age;
	}
	private Person(int id){
		this.id = id;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	private void hello1(){
		
	}
	public int myAge(){
		return age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", job=" + job + ", age=" + age + "]";
	}
	
	

}

大家可以看到有不同修饰符的变量、构造器和方法。

然后在Test类中调用:

package com.gefufeng.test;

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

import com.gefufeng.bean.Person;

public class Test {

	@org.junit.Test
	public void test() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		Person person = new Person();
		Class<?> personClass = person.getClass();
		System.out.println("类的修饰符----------------"+ Modifier.toString(personClass.getModifiers()));
		System.out.println("类的包信息----------------"+personClass.getPackage());
//		类的修饰符----------------public
//		类的包信息----------------package com.gefufeng.bean
		
		/**
		 * 构造器
		 */
		Constructor<?> [] cons = personClass.getConstructors();
		System.out.println("public类型构造器----------");
		for (int i = 0; i < cons.length; i++) {
			System.out.println(cons[i]);
		}
		Constructor<?> [] dcs = personClass.getDeclaredConstructors();
		System.out.println("所有构造器----------");
		for (int i = 0; i < dcs.length; i++) {
			System.out.println(dcs[i]);
		}
		Constructor<?> con = personClass.getConstructor();//无參的构造器
		Person p = (Person) con.newInstance();//通过无參的构造器实例化一个Person类
		System.out.println("通过无參的构造器实例化Person------------");
		System.out.println(p);
//		public类型构造器----------
//		public com.gefufeng.bean.Person(int,java.lang.String,java.lang.String,int)
//		public com.gefufeng.bean.Person()
//		所有构造器----------
//		private com.gefufeng.bean.Person(int)
//		public com.gefufeng.bean.Person(int,java.lang.String,java.lang.String,int)
//		public com.gefufeng.bean.Person()
//		通过无參的构造器实例化Person------------
//		Person [id=0, name=null, job=null, age=0]
		
		/**
		 * 变量
		 */
		Field [] declaredFileds = personClass.getDeclaredFields();
		Field [] fs = personClass.getFields();
		System.out.println("public 类型的变量----------------");
		for (int i = 0; i < fs.length; i++) {
			System.out.println(fs[i]);
		}
		System.out.println("所有类型的变量----------------");
		for (int i = 0; i < declaredFileds.length; i++) {
			System.out.println(declaredFileds[i]);
		}
		System.out.println("获取名字为“name”变量----------------");
		Field nameField = personClass.getDeclaredField("name");
		nameField.setAccessible(true);//关闭指定类 Field 实例的反射访问检查
		System.out.println("变量的修饰符" + Modifier.toString(nameField.getModifiers()));
		System.out.println("变量的名字" + nameField.getName());
		System.out.println("变量的类型" + nameField.getType());
		nameField.set(person, "make");
		System.out.println("变量的值" + nameField.get(person));
//		所有类型的变量----------------
//		private int com.gefufeng.bean.Person.id
//		private java.lang.String com.gefufeng.bean.Person.name
//		java.lang.String com.gefufeng.bean.Person.job
//		public int com.gefufeng.bean.Person.age
//		获取名字为“name”变量----------------
//		变量的修饰符private
//		变量的名字name
//		变量的类型class java.lang.String
//		变量的值make
		
		/**
		 * 方法
		 */
		System.out.println("public 类型的方法----------------");
		Method [] declaredMethods = personClass.getDeclaredMethods();
		Method [] methods = personClass.getMethods();
		for (int i = 0; i < methods.length; i++) {
			System.out.println(methods[i]);
		}
		System.out.println("所有类型的方法----------------");
		for (int i = 0; i < declaredMethods.length; i++) {
			System.out.println(declaredMethods[i]);	
		}
		Method setJobMethod = personClass.getDeclaredMethod("setJob", new Class [] {String.class});
		Method getJobMethod = personClass.getDeclaredMethod("getJob");//该方法没有参数
		setJobMethod.setAccessible(true);//关闭指定类 Field 实例的反射访问检查
		getJobMethod.setAccessible(true);//关闭指定类 Field 实例的反射访问检查
		setJobMethod.invoke(person, "java工程师");
		System.out.println("调用person的getjob方法:" + getJobMethod.invoke(person));
//		public 类型的方法----------------
//		public java.lang.String com.gefufeng.bean.Person.toString()
//		public void com.gefufeng.bean.Person.setJob(java.lang.String)
//		public java.lang.String com.gefufeng.bean.Person.getJob()
//		public int com.gefufeng.bean.Person.myAge()
//		public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
//		public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
//		public final void java.lang.Object.wait() throws java.lang.InterruptedException
//		public boolean java.lang.Object.equals(java.lang.Object)
//		public native int java.lang.Object.hashCode()
//		public final native java.lang.Class java.lang.Object.getClass()
//		public final native void java.lang.Object.notify()
//		public final native void java.lang.Object.notifyAll()
//		所有类型的方法----------------
//		public java.lang.String com.gefufeng.bean.Person.toString()
//		public void com.gefufeng.bean.Person.setJob(java.lang.String)
//		public java.lang.String com.gefufeng.bean.Person.getJob()
//		private void com.gefufeng.bean.Person.hello1()
//		public int com.gefufeng.bean.Person.myAge()
//		调用person的getjob方法:java工程师

		

	}

}

我觉得这个类也没什么解释的,一切都在注释中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值