什么是反射销部?
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中摸航,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法舅桩;對(duì)于任意一個(gè)對(duì)象酱虎,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制擂涛。
通過反射來了解類
1读串、類由屬性,方法撒妈,構(gòu)造函數(shù)等組成
2恢暖、給定一個(gè)類或?qū)ο螅ㄟ^反射機(jī)制可以動(dòng)態(tài)的了解類的屬性方法狰右,構(gòu)造函數(shù)杰捂,創(chuàng)建對(duì)象,調(diào)用方法棋蚌,改寫屬性
3嫁佳、應(yīng)用場(chǎng)景:(1)運(yùn)行時(shí),動(dòng)態(tài)的情況下應(yīng)對(duì)外面?zhèn)魅氲摹邦惷惫饶海瑢?duì)象實(shí)例等蒿往。(2)只知道類名字符串。(3)通常應(yīng)用到框架中 湿弦。
常用的反射操作 (以Dog這個(gè)類為例子)
package learnReflect;
public class Dog {
public String name;
public int age;
private String owner;
public Dog(){
}
public Dog(String name,int age){
this.name = name;
this.age = age;
}
public void bark(){
System.out.println("汪汪");
}
public void celebrateBirthday(){
System.out.println(name+"生日快樂");
addAge();
}
private void addAge(){
age = age+1;
}
}
1瓤漏、通過一個(gè)對(duì)象獲得完整的包名和類名
public static void getClassFullName(Dog d){
System.out.println("1.獲取包名和類名");
Class c = d.getClass();
System.out.println("類名: "+c.getName());
System.out.println("包名: "+c.getPackage().getName());
}
2、獲得Class對(duì)象 3種方法
public static void getClassInstance(){
System.out.println("2.獲得類實(shí)例 - 2種方法");
try {
String className = "learnReflect.Dog";
Class c = Class.forName(className);
System.out.println("method 1:"+c.getName());
Class d = Dog.class;
System.out.println("method 2:"+c.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
3、了解類的各種信息
1蔬充、獲取本類的聲明方法,調(diào)用類的方法俯在。
public static void getClassMethod(){
Class<Dog> dogClazz = Dog.class;
Method[] methods = dogClazz.getMethods();//能獲取Dog類所有的public方法,不能獲取private
Method[] methods2 = dogClazz.getDeclaredMethods();//只能獲取Dog類自己定義的所有方法包括私有方法
for(Method m : methods)
System.out.println(m.getName());
try {
//"bark"是方法名娃惯,不存在時(shí)會(huì)拋出異常,new Class[]{}是參數(shù)類型數(shù)組肥败,無參數(shù)就為空
Method method = dogClazz.getMethod("bark", new Class[]{});
//invoke方法用于調(diào)用方法趾浅,參數(shù)為類的實(shí)例和方法的參數(shù)
method.invoke(dogClazz.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
>2、獲得父類信息
>```
public static void getClassSuperClassInfo(){
Class<Dog> dogClazz = Dog.class;
System.out.println("Dog父類的名字是:"+dogClazz.getSuperclass());
}
3馒稍、獲得接口信息
public static void getClassInterfaceInfo(){
Class<Dog> dogClazz = Dog.class;
for(int i = 0; i< dogClazz.getInterfaces().length;i++)
System.out.println(dogClazz.getInterfaces()[i].getName());
}
4皿哨、根據(jù)Class對(duì)象創(chuàng)建instance實(shí)例
public static void getInstance(){
System.out.println("創(chuàng)建對(duì)象實(shí)例======");
Class<Dog> dogClazz = Dog.class;
try {//方法1:無參的構(gòu)造方法
Object o = dogClazz.newInstance();
System.out.println("創(chuàng)建的對(duì)象是:"+o);
//方法2:有參數(shù)的構(gòu)造方法
Constructor c = dogClazz.getConstructor(new Class[]{String.class,int.class});
Dog o2 = (Dog) c.newInstance("大黃",4);
System.out.println("創(chuàng)建的對(duì)象是:"+o2.name);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
5、操作成員變量
public static void changeFiled(){
System.out.println("改變成員變量======");
Class<Dog> dogClazz = Dog.class;
try {
Object o = dogClazz.newInstance();
//方法2
Constructor c = dogClazz.getConstructor(new Class[]{String.class,int.class});
Dog o2 = (Dog) c.newInstance("大黃",4);
Field[] fields = dogClazz.getFields();
for(Field f : fields){
System.out.println(f.getName());
}
Field[] fields2 = dogClazz.getDeclaredFields();
for(Field f : fields2){
System.out.println(f.getName());
}
Field f = dogClazz.getField("name");
f.set(o2, "大黑");
System.out.println(f.get(o2));
// getDeclaredField()用于獲取私有成員變量纽谒,必須設(shè)置setAccessible(true)才能改變
Field f2 = dogClazz.getDeclaredField("owner");
f2.setAccessible(true);
f2.set(o2, "張三");
System.out.println(f2.get(o2));
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}