定義:
Java反射機(jī)制是指在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象程拭,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制帆阳。
用一句話總結(jié)就是反射可以實(shí)現(xiàn)在運(yùn)行時(shí)可以知道任意一個(gè)類的屬性和方法哺壶。
Class類和類類型:
通過已有的類得到它的Class對象,共有三種方式:
package Reflect;
class Demo{
//other codes...
}
class hello{
public static void main(String[] args) {
Class<?> demo1=null;
Class<?> demo2=null;
Class<?> demo3=null;
try{
//一般盡量采用這種形式
demo1=Class.forName("Reflect.Demo");
}catch(Exception e){
e.printStackTrace();
}
demo2=new Demo().getClass();
demo3=Demo.class;
System.out.println("類名稱 "+demo1.getName());
System.out.println("類名稱 "+demo2.getName());
System.out.println("類名稱 "+demo3.getName());
}
}
運(yùn)行結(jié)果:
類名稱 Reflect.Demo
類名稱 Reflect.Demo
類名稱 Reflect.Demo
獲取構(gòu)造函數(shù)Constructor:
Person類蜒谤,定義了幾個(gè)構(gòu)造方法:
package Reflect;
import java.lang.reflect.Constructor;
class Person{
public Person() {
}
public Person(String name){
this.name=name;
}
public Person(int age){
this.age=age;
}
public Person(String name, int age) {
this.age=age;
this.name=name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString(){
return "["+this.name+" "+this.age+"]";
}
private String name;
private int age;
}
通過無參構(gòu)造實(shí)例化對象:
在加上有參構(gòu)造函數(shù)后山宾,默認(rèn)無參構(gòu)造函數(shù)失效,一定要添上無參構(gòu)造函數(shù)鳍徽。
demo=Class.forName("Reflect.Person");
per=(Person)demo.newInstance();
per.setName("Rollen");
per.setAge(20);
通過反射:
demo=Class.forName("Reflect.Person");
Person per1=null;
Person per2=null;
Person per3=null;
Person per4=null;
//取得全部的構(gòu)造函數(shù)
Constructor<?> cons[]=demo.getConstructors();
per1=(Person)cons[0].newInstance();
per2=(Person)cons[1].newInstance("Rollen");
per3=(Person)cons[2].newInstance(20);
per4=(Person)cons[3].newInstance("Rollen",20);
System.out.println(per1);
System.out.println(per2);
System.out.println(per3);
System.out.println(per4);
獲取成員方法Method:
- public Methods = getDeclaredMethods(); // 得到該類所有的方法资锰,不包括父類的。
- public Methods = getMethods();// 得到該類所有的public方法阶祭,包括父類的绷杜。
public class Person {
private String name;
private int age;
private String msg="hello wrold";
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 Person() {
}
private Person(String name) {
this.name = name;
System.out.println(name);
}
public void fun() {
System.out.println("fun");
}
public void fun(String name,int age) {
System.out.println("我叫"+name+",今年"+age+"歲");
}
}
public class ReflectDemo {
public static void main(String[] args){
try {
Class c = Class.forName("Reflect.Person");
Object o = c.newInstance();
Method method = c.getMethod("fun", String.class, int.class);
method.invoke(o, "aaa", 10);
} catch (Exception e) {
e.printStackTrace();
}
}
}
執(zhí)行結(jié)果:
我叫aaa,今年10歲
- Method[] methods = c.getDeclaredMethods(); // 得到該類所有的方法,不包括父類的濒募。
- Method[] methods = c.getMethods();// 得到該類所有的public方法鞭盟,包括父類的。
public class ReflectDemo {
public static void main(String[] args){
try {
Class c = Class.forName("com.tengj.reflect.Person");
Method[] methods = c.getDeclaredMethods();
for(Method m:methods){
String methodName= m.getName();
System.out.println(methodName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
獲取成員變量Field:
- public Field getDeclaredField(String name) // 獲得該類自身聲明的所有變量瑰剃,不包括其父類的變量齿诉。
- public Field getField(String name) // 獲得該類自所有的public成員變量,包括其父類變量晌姚。
public class ReflectDemo {
public static void main(String[] args){
try {
Class c = Class.forName("Reflect.Person");
//獲取成員變量
Field field = c.getDeclaredField("msg"); //因?yàn)閙sg變量是private的粤剧,所以不能用getField方法
Object o = c.newInstance();
field.setAccessible(true);//設(shè)置是否允許訪問,因?yàn)樵撟兞渴莗rivate的挥唠,所以要手動(dòng)設(shè)置允許訪問抵恋,如果msg是public的就不需要這行了。
Object msg = field.get(o);
System.out.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Field[] fields = c.getDeclaredFields(); // 獲得該類自身聲明的所有變量宝磨,不包括其父類的變量弧关。
- Field[] fields = c.getFields(); // 獲得該類自所有的public成員變量盅安,包括其父類變量。
public class ReflectDemo {
public static void main(String[] args){
try {
Class c = Class.forName("com.tengj.reflect.Person");
Field[] fields = c.getDeclaredFields();
for(Field field :fields){
System.out.println(field.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
還可以通過
Class<?> intes[]=Class.forName("Reflect.Person").getInterfaces();
返回繼承的接口梯醒。
通過Class<?> temp=Class.forName("Reflect.Person").getSuperclass();
返回繼承的父類宽堆。