总结一下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工程师
}
}
我觉得这个类也没什么解释的,一切都在注释中。


被折叠的 条评论
为什么被折叠?



