這是我參與更文挑戰的第27天,活動詳情查看: 更文挑戰java
記得以前寫了一篇json轉實體的文章web
記得以前寫了一篇json轉實體的文章,裏面就用到了java反射的文章,可是當時只是瞭解到反射這個知識點,並無深刻的瞭解,寒假閒來無事覺頂深刻整理一下java 反射的知識,一下都是我的學習反射的總結,不到之處,還望大神指點!!!面試
反射顧名思義就是和java編譯相反的過程,這裏實現的效果就是經過類名來進行實例化類對象並對類進行操做。具體看下json
首先咱們的java類是能夠繼承和實現多個接口的,那麼咱們如何經過java反射獲取java類的父類和接口呢?markdown
首先咱們在這裏新建一個Annimal做爲父類架構
public class Annimal {
private String AnnimalName;
public void eat(){
System.out.println("Annimal is eatting");
}
public void run(){
System.out.println("Annimal is running");
}
}
複製代碼
public interface Behaviour {
public String haviour="test";
public void sayHello();
public void isAngury();
public void love();
}
複製代碼
public class Dog extends Annimal implements Behaviour
複製代碼
public class Dog extends Annimal implements Behaviour{
private String dogName;
public void fuck(String name){
System.out.println("fuck To : "+name);
}
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("Dog sayHello");
}
@Override
public void isAngury() {
// TODO Auto-generated method stub
System.out.println("Dog isAngury");
}
@Override
public void love() {
// TODO Auto-generated method stub
System.out.println("Dog love");
}
}
複製代碼
測試框架
下面咱們開始進行測試,首先咱們經過Class類來獲取類的class對象ide
Class<?> target=Class.forName("tom.change.Reflect.獲取父類和全部接口.Dog");
複製代碼
//獲取Dog類的父類
Class<?> parent=target.getSuperclass();
//獲取該類繼承的全部類
Class<?> intefaces[]=target.getInterfaces();
複製代碼
Dog類:svn
private String dogName;
複製代碼
Class<?> clazz=Class.forName("tom.change.Reflect.獲取父類和全部接口.Dog");
複製代碼
for (int i = 0; i < fields.length; i++) {
//獲取字段的修飾權限符
System.out.println(Modifier.toString(fields[i].getModifiers())+"@@@"+fields[i].getName());
}
複製代碼
這裏說一下,獲取後用Field 來接受,這個類getModifiers是獲取該屬性的屬性的,私有仍是公共仍是保護的。函數
這裏獲取字段後,經過Field的set方法就能夠給屬性設置,無論屬性的對外狀態。前提是開啓權限
field.setAccessible(true);
field.set(object, "21131084");
複製代碼
public void tom.change.Reflect.獲取父類和全部接口.Dog.fuck(java.lang.String)
public void tom.change.Reflect.獲取父類和全部接口.Dog.sayHello()
public void tom.change.Reflect.獲取父類和全部接口.Dog.love()
public void tom.change.Reflect.獲取父類和全部接口.Dog.isAngury()
public void tom.change.Reflect.獲取父類和全部接口.Annimal.run()
public void tom.change.Reflect.獲取父類和全部接口.Annimal.eat()
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 final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
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()
複製代碼
public Object invoke(Object obj, Object... args)
複製代碼
源碼顯示,方法須要參數有多少這裏就傳入多少,這裏是通用的。
在經過getMethod獲取Method的時候咱們須要傳入方法參數的類型
```
public Object invoke(Object obj, Object... args)
```
```
public Method getMethod(String name, Class<?>... parameterTypes)
```
複製代碼