1、新建个实体类
// An highlighted block
package test.reflect;
public class Student {
private int id;
public String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(){}
public Student(String name){
this.name = name;
}
public void print(){
System.out.println("id:"+this.id+"--name:"+this.name+"--age:"+this.age);
}
}
2、通过反射获取类的信息
// An highlighted block
package test.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射获取类信息
*
*/
public class demo01 {
public static void main(String[] args) {
String path = "test.reflect.Student";
try{
Class clazz = Class.forName(path);
System.out.println("包名+类名:"+clazz.getName());//类的包名+类名
System.out.println("类名:"+clazz.getSimpleName());//类名
//获取属性信息
Field[] field = clazz.getFields();//获取public修饰属性
Field[] fields = clazz.getDeclaredFields();//获取所有属性
Field fieldid = clazz.getDeclaredField("id");//获取指定属性
for(Field f : field){
System.out.println("public属性:"+f.getName());
}
for(Field f : fields){
System.out.println("所有属性:"+f.getName());
}
System.out.println("指定属性:"+fieldid);
//获取方法信息
Method[] methods = clazz.getDeclaredMethods();
for(Method mm:methods){
System.out.println("所有方法:"+mm);
}
Method m = clazz.getDeclaredMethod("getId", null);
System.out.println("指定方法:"+m);
//获取构造器
Constructor[] constructors = clazz.getDeclaredConstructors();
for(Constructor c : constructors){
System.out.println("所有构造器:"+c);
}
Constructor c1 = clazz.getDeclaredConstructor(String.class);
System.out.println("带参构造器:"+c1);
Constructor c2 = clazz.getDeclaredConstructor(null);
System.out.println("无参构造器:"+c2);
}catch(Exception e){
}
}
}
包名+类名:test.reflect.Student
类名:Student
public属性:name
所有属性:id
所有属性:name
所有属性:age
指定属性:private int test.reflect.Student.id
所有方法:public void test.reflect.Student.setId(int)
所有方法:public int test.reflect.Student.getAge()
所有方法:public void test.reflect.Student.setAge(int)
所有方法:public java.lang.String test.reflect.Student.getName()
所有方法:public int test.reflect.Student.getId()
所有方法:public void test.reflect.Student.setName(java.lang.String)
所有方法:public void test.reflect.Student.print()
指定方法:public int test.reflect.Student.getId()
所有构造器:public test.reflect.Student()
所有构造器:public test.reflect.Student(java.lang.String)
带参构造器:public test.reflect.Student(java.lang.String)
无参构造器:public test.reflect.Student()
3、通过反射操作类
// An highlighted block
package test.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射调用方法操作类
*
*/
public class demo02 {
public static void main(String[] args) {
String path = "test.reflect.Student";
try {
Class clazz = Class.forName(path);
Student student = (Student) clazz.newInstance();//调用无参构造器
System.out.println(student.hashCode());
通过反射调用构造方法
Constructor c1 = clazz.getDeclaredConstructor(String.class);
Student s2 = (Student) c1.newInstance("周星星");
System.out.println(s2.getName());
System.out.println("==========================");
//通过反射调用普通方法
Student s3 = (Student) clazz.newInstance();
Method method = clazz.getDeclaredMethod("setId", int.class);
method.invoke(s3, 100);
System.out.println(s3.getId());
System.out.println("==========================");
//通过反射操作属性
Student s4 = (Student) clazz.newInstance();
Field f1 = clazz.getDeclaredField("age");
Field f2 = clazz.getDeclaredField("id");
Field f3 = clazz.getDeclaredField("name");
f1.setAccessible(true);
f2.setAccessible(true);
f3.setAccessible(true);
f1.set(s4, 20);
f2.set(s4, 1);
f3.set(s4, "张无忌");
s4.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}
21174459
周星星
==========================
100
==========================
id:1--name:张无忌--age:20