这是我参与更文挑战的第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)
```
复制代码