记得之前写了一篇json转实体的文章
记得之前写了一篇json转实体的文章,里面就用到了java反射的文章,但是当时只是了解到反射这个知识点,并没有深入的了解,寒假闲来无事觉顶深入整理一下java 反射的知识,一下都是个人学习反射的总结,不到之处,还望大神指点!!!
反射顾名思义就是和java编译相反的过程,这里实现的效果就是通过类名来进行实例化类对象并对类进行操作。具体看下
首先我们的java类是可以继承和实现多个接口的,那么我们如何通过java反射获取java类的父类和接口呢?
首先我们在这里新建一个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对象
Class<?> target=Class.forName("tom.change.Reflect.获取父类和所有接口.Dog");
//获取Dog类的父类
Class<?> parent=target.getSuperclass();
//获取该类继承的所有类
Class<?> intefaces[]=target.getInterfaces();
Dog类:
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)
```
原文:https://www.cnblogs.com/zhangxinhua/p/11495412.html