1.反射获取成员方法
常用方法如下:
| 方法名字 | 说明 |
|---|---|
| getMethods() | 返回的是当前Class对象的所有公有的方法,包含从父类或父接口继承而来的方法。 |
| getDeclaredMethods() | 返回的是当前Class对象的所有(包括:public,protected,default,private)方法,但是并不包括继承自父类或父接口的方法。 |
| getMethod() | 获取指定类型的,自身能用的公共方法。1.类本身的public 2.继承父类的public 3.实现接口的public |
| getDeclaredMethod() | 获取指定类型的自身声明的方法。 |
| invoke() | 执行方法。 |
实例:
class Person {
private String name;
private String gender;
private String birthday;
public Person() {
}
public Person(String name, String gender, String birthday) {
this.name = name;
this.gender = gender;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
private void secrete(String content) {
System.out.println("Show secrete is : " + content);
}
protected void sayHello(String msg) {
System.out.println("hello," + msg);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("demo2.Person");
Method[] methods = clazz.getMethods();
System.out.println("---------the result for getMethods------------");
for (Method m : methods) {
System.out.println(m.toGenericString());
}
methods = clazz.getDeclaredMethods();
System.out.println("---------the result for getDeclaredMethods------------");
for (Method m : methods) {
System.out.println(m.toGenericString());
}
Method m = clazz.getMethod("equals",Object.class);
System.out.println("--------the result for getMethod----------");
System.out.println(m.toGenericString());
//m = clazz.getMethod("secrete",String.class); //错误,不能获取私有方法。
//System.out.println(m.toGenericString());
System.out.println("--------the result for getDeclaredMethod----------");
//m = clazz.getDeclaredMethod("equals",Object.class); //错误,equals不是自身声明的方法。
//System.out.println(m.toGenericString());
m = clazz.getDeclaredMethod("secrete",String.class);
System.out.println(m.toGenericString());
m.setAccessible(true); //私有方法执行前必须设置可访问。
Person p = new Person();
m.invoke(p,"this is a dream!");
}
}
运行结果:
---------the result for getMethods------------
public java.lang.String demo2.Person.toString()
public java.lang.String demo2.Person.getName()
public void demo2.Person.setName(java.lang.String)
public java.lang.String demo2.Person.getGender()
public void demo2.Person.setGender(java.lang.String)
public java.lang.String demo2.Person.getBirthday()
public void demo2.Person.setBirthday(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
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 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()
---------the result for getDeclaredMethods------------
public java.lang.String demo2.Person.toString()
public java.lang.String demo2.Person.getName()
public void demo2.Person.setName(java.lang.String)
public java.lang.String demo2.Person.getGender()
private void demo2.Person.secrete(java.lang.String)
public void demo2.Person.setGender(java.lang.String)
public java.lang.String demo2.Person.getBirthday()
public void demo2.Person.setBirthday(java.lang.String)
protected void demo2.Person.sayHello(java.lang.String)
--------the result for getMethod----------
public boolean java.lang.Object.equals(java.lang.Object)
--------the result for getDeclaredMethod----------
private void demo2.Person.secrete(java.lang.String)
Show secrete is : this is a dream!
2.反射获取构造方法
常用方面如下:
| 方法名字 | 说明 |
|---|---|
| getConstructors() | 返回的是当前Class对象的所有公有的构造方法。 |
| getDeclaredConstructors() | 返回的是当前Class对象所有的构造方法。 |
| getConstructor() | 返回指定类型的公有的构造方法。 |
| getDeclaredConstructor() | 返回指定类型的构造方法。 |
| newInstance() | 执行构造方法。 |
实例:
class Person {
private String name;
private String gender;
private String birthday;
private Person() {
}
public Person(String name){
this.name = name;
}
public Person(String name, String gender, String birthday) {
this.name = name;
this.gender = gender;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
private void secrete(String content) {
System.out.println("Show secrete is : " + content);
}
protected void sayHello(String msg) {
System.out.println("hello," + msg);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("demo2.Person");
Constructor[] constructors = clazz.getConstructors();
System.out.println("------the result for getConstructors------------");
for(Constructor constructor: constructors){
System.out.println(constructor.toGenericString());
}
System.out.println("------the result for getDeclaredConstructors------------");
constructors = clazz.getDeclaredConstructors();
for(Constructor constructor: constructors){
System.out.println(constructor.toGenericString());
}
Constructor conn = clazz.getConstructor(String.class);
System.out.println("------the result for getConstructor------------");
System.out.println(conn.toGenericString());
Person p1 = (Person) conn.newInstance("张三");
System.out.println(p1);
//conn = clazz.getConstructor(); //错误,不能获取私有构造方法
//System.out.println(conn.toGenericString());
conn = clazz.getDeclaredConstructor();
System.out.println("------the result for getDeclaredConstructor------------");
System.out.println(conn.toGenericString());
conn.setAccessible(true); //私有构造方法执行前必须设置可访问。
Person p2 = (Person) conn.newInstance();
System.out.println(p2);
}
}
运行结果:
------the result for getConstructors------------
public demo2.Person(java.lang.String,java.lang.String,java.lang.String)
public demo2.Person(java.lang.String)
------the result for getDeclaredConstructors------------
public demo2.Person(java.lang.String,java.lang.String,java.lang.String)
public demo2.Person(java.lang.String)
private demo2.Person()
------the result for getConstructor------------
public demo2.Person(java.lang.String)
Person{name='张三', gender='null', birthday='null'}
------the result for getDeclaredConstructor------------
private demo2.Person()
Person{name='null', gender='null', birthday='null'}
3.反射获取属性
常用方法如下:
| 方法名字 | 说明 |
|---|---|
| getFields() | 返回的是当前Class对象的所有公有的属性。 |
| getDeclaredFields() | 返回的是当前Class对象所有属性。但是不包含继承的属性 |
| getField() | 返回指定类型的公有的属性。 |
| getDeclaredField() | 返回指定类型的属性。 |
| get() | 获取属性值。 |
实例:
class Animal{
protected int weight;
}
class Person extends Animal {
public int height;
private String name;
private String gender;
private String birthday;
private Person() {
}
public Person(String name){
this.name = name;
}
public Person(String name, String gender, String birthday) {
this.name = name;
this.gender = gender;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
private void secrete(String content) {
System.out.println("Show secrete is : " + content);
}
protected void sayHello(String msg) {
System.out.println("hello," + msg);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("demo2.Person");
Field[] fields = clazz.getFields();
System.out.println("------the result for getFields--------");
for(Field field : fields){
System.out.println(field.toGenericString());
}
fields = clazz.getDeclaredFields();
System.out.println("------the result for getDeclaredFields--------");
for(Field field : fields){
System.out.println(field.toGenericString());
}
Field field = clazz.getField("height");
System.out.println("------the result for getField--------");
System.out.println(field.toGenericString());
//field = clazz.getField("name"); //错误,不能访问私有属性
//System.out.println(field.toGenericString());
field = clazz.getDeclaredField("name");
System.out.println("------the result for getDeclaredField--------");
System.out.println(field.toGenericString());
Person p = new Person("张三");
field.setAccessible(true); //获取私有属性值前必须设置可访问
System.out.println(field.get(p));
}
}
运行结果:
------the result for getFields--------
public int demo2.Person.height
------the result for getDeclaredFields--------
public int demo2.Person.height
private java.lang.String demo2.Person.name
private java.lang.String demo2.Person.gender
private java.lang.String demo2.Person.birthday
------the result for getField--------
public int demo2.Person.height
------the result for getDeclaredField--------
private java.lang.String demo2.Person.name
张三