常用方法:
Constructor類用於描述類中的構造方法:
Constructor<T> getConstructor(Class<?>... parameterTypes)
返回該Class對象表示類的指定的public構造方法;
Constructor<?>[] getConstructors()
返回該Class對象表示類的所有public構造方法;
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回該Class對象表示類的指定的構造方法,和訪問權限無關;
Constructor<?>[] getDeclaredConstructors()
返回該Class對象表示類的所有構造方法,和訪問權限無關;
Method類用於描述類中的方法:
Method getMethod(String name, Class<?> ... parameterTypes)
返回該Class對象表示類和其父類的指定的public方法;
Method[] getMethods():
返回該Class對象表示類和其父類的所有public方法;
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回該Class對象表示類的指定的方法。和訪問權限無關,但不包括繼承的方法;
Method[] getDeclaredMethods(): 獲得類所有的方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法;
Eg:
package junereflect624;
import java.lang.reflect.Constructor;
class Emp{
private String name;
private int age;
private Emp() {
}
Emp(String name){
}
public Emp(String name,int age){
}
}
public class ConstructorDemo4 {
public static void main(String[] args) throws Exception {
//得到所有的構造器(先得到類)
Class<Emp> c = Emp.class;
/**
* Constructor<?>[] getConstructors()
返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公共構造方法。
*/
Constructor[] con = c.getConstructors();//前面的修飾符必須是public才可以在這個方法下獲取到
for (Constructor cons : con) {
System.out.println("c.getConstructors()"+cons);//如果上面的某構造器public去掉,則顯示不出
/**打印
public junereflect624.Emp(java.lang.String,int)
*/
}
//得到指定的構造器,也是必須public
Constructor c1 = c.getConstructor(String.class,int.class);
System.out.println(c1);//public junereflect624.Emp(java.lang.String,int)
System.out.println("====================================");
//現在想獲得不受public影響的,getDeclaredConstructors(),暴力反射
con = c.getDeclaredConstructors();
for (Constructor cons : con) {
System.out.println("c.getDeclaredConstructors()=="+cons);//此時不受修飾符的影響
/**打印
* public junereflect624.Emp()
public junereflect624.Emp(java.lang.String)
public junereflect624.Emp(java.lang.String,int)
*/
}
}
}
package junereflect624;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class AB{
protected String name;
protected String id;
}
@Deprecated
public class MethodDemo5 extends AB{
void show(){}
public void say(){}
private int age;
public char c;
private boolean b;
public static void main(String[] args) throws Exception {
Class<MethodDemo5> c = MethodDemo5.class;
//獲取所有的(包含父類的方法)public修飾的方法
Method[] m = c.getMethods();
for (Method method : m) {
System.out.println(method);
}
//總結:4個方法,獲取全部,獲取特定;不受修飾符影響的全部,不受修飾符影響的特定;(前兩個都還是受限制的)
//獲取指定的方法
Method me = c.getMethod("main", String[].class);
System.out.println("main "+me);//main public static void junereflect624.MethodDemo5.main(java.lang.String[]) throws java.lang.Exception
//訪問所有方法,不受訪問權限影響
m = c.getDeclaredMethods();
for (Method method : m) {
System.out.println("不受影響的:"+method);
}
me = c.getDeclaredMethod("show");
System.out.println(me);//void junereflect624.MethodDemo.show()
me = c.getMethod("toString");
System.out.println(me);//public java.lang.String java.lang.Object.toString()
/**
* Method[] getDeclaredMethods()
返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,
包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法,只可以對當前類有效
*/
/*me = c.getDeclaredMethod("toString");//ERROR,c.getDeclaredMethod()不能得到繼承的方法
System.out.println(me);//public java.lang.String java.lang.Object.toString()
*/
//得到字段
Field[] f = c.getFields();
for (Field field : f) {//只得到了public的
System.out.println("字段"+field);
}
//特定字段
Field fi = c.getField("c");//""里面是名稱
System.out.println(fi);//public char junereflect624.MethodDemo.c
//得到不受限定名限定的全部字段
f = c.getDeclaredFields();
for (Field field : f) {//得到不受修飾符限定的字段,但是只對當前類有效
System.out.println("全部字段:"+field);
/**
* 全部字段:private int junereflect624.MethodDemo.age
全部字段:public char junereflect624.MethodDemo.c
全部字段:private boolean junereflect624.MethodDemo.b
*/
}
//注釋 Annotation
Annotation[] a = c.getAnnotations();
System.out.println(a.length);
for (Annotation annotation : a) {
System.out.println(annotation);
}
//特定注解
Deprecated d = c.getAnnotation(Deprecated.class);
System.out.println(d);
}
}
獲取當前對象的字段:
package july78javaEnhance;
import java.lang.reflect.Field;
class Stu{
public String name;
public String sex;
public int age;
public Stu(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
}
public class ReflectDemo6 {
public static void main(String[] args) throws Exception {
Stu s = new Stu("劉昭", "男", 12);
Class<Stu> c = Stu.class;
Field f = c.getField("name");
System.out.println(f.get(s));////從哪個對象身上取!此時顯示劉昭!
// 修改對象的值
/**
Field f = c.getField("name");
f.set(s,"章澤天");
System.out.println(f.get(s));//從哪個對象身上取!//此時顯示章澤天
*/
}
}
我的總結:對於方法,字段,構造方法之類用類獲取記住四個:獲取全部,獲取特定,暴力獲取全部,暴力獲取特定!