首页 > 编程知识 正文

java多态,java反射父类

时间:2023-05-05 03:18:39 阅读:162680 作者:2644

我记得以前json写过一篇改变实体的文章。 那里使用了java反射的文章。 但是,当时只知道反射这个知识点,并没有深入理解。 寒假闲暇时间深入整理java反射知识,很快就会成为个人学习反射的总结。 有不到的地方,请再次向大神指出。 呃! 呃!

顾名思义,反射是与java编译相反的过程,具有用类名实例化类对象和处理类的效果。 具体来看

获取父类和所有接口

首先,由于java类可以继承并实现多个接口,那么如何使用java反射来获取java类的父类和接口呢?

首先,在此创建一个新的Annimal作为父类

公共类分析{

private String AnnimalName;

公共void eat

system.out.println (annimaliseatting );

() ) ) ) )。

公共语音运行(}

system.out.println (annimalisrunning );

() ) ) ) )。

() ) ) ) )。

接下来,创建新的Behaviour接口

public interface Behaviour {

public String haviour='test ';

public void sayHello (;

公共void isang URY (;

公共语音love (;

() ) ) ) )。

现在,让我们创建一个新的Dog类,让Dog类继承Annimal类,并实现一个名为Behavour的接口

publicclassdogextendsannimalimplementsbehaviour

Dog源代码

publicclassdogextendsannimalimplementsbehaviour {

私有字符串文档;

公共void fuck (string name ) {

system.out.println (' fuck to : ' name );

() ) ) ) )。

@Override

公共void say hello () {

//todo自动生成方法stub

system.out.println(dogsayHello );

() ) ) ) )。

@Override

公共void isang URY

//todo自动生成方法stub

system.out.println(dogisangury );

() ) ) ) )。

@Override

公共语音love () {

//todo自动生成方法stub

system.out.println(doglove );

() ) ) ) )。

() ) ) ) )。

测试

开始测试吧。 首先从Class类中获取类的Class对象

classtarget=class.forname (Tom.change.reflect .父类和所有接口. Dog ) );

然后,可以通过两种方法获取父类和所有接口: getSuperClass和getInterfaces

获取//dog类的父类

class parent=target.get super class (;

//获取该类继承的所有类

classintefaces [ ]=target.get interfaces (;

最后查看程序运行的效果图

获取所有属性(getDeclaredFields ) )。

Java类显示了类与类之间的关系,每个类都有特定的属性。 那么,如何通过反射来获取Java类的属性呢? 以下写了user类。 其中的属性如下

Dog类:

私有字符串文档;

那么,试试看能不能取得上面的几个属性。 从类路径中获取class对象

class clazz=class.forname (' Tom.change.reflect .获取父类和所有接口. Dog ' );

然后从class对象的getDeclaredFields方法中获取本地类的属性。 此方法无法获取继承的父类和接口的属性。 如果不检索,则首先从该类中获取父类,然后获取父类的class对象,再获取父类的属性。

for(intI=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");

这里的object是class的一个实例化对象

获取类中的所有的方法(getMethods)

在上面我们已经获取了类中所有的属性,那么下面我们自然就是获取类中的所有的方法了。同样的步骤上面已经有了,这里不赘述了,只不过和上面的不同的地方就是获取class对象后我们调用getMethods方法。

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()

大家有没有疑问,为什么有一些莫名的方法出现,有些方法甚至我们的Dog和继承类中都没有出现过,这是怎么回事呢。首先getMethods获取类本身的方法这是肯定的。继承的类我们也是可以获取的,这就解释了为什么我们的获取方法中有Annimal类中的方法,。那么后面那些Object类的方法是哪里来的呢,大家还记得吗所有的类都是继承Object类的。

类中方法的调用(getMethod)

在上面我们获取了方法后,通过getMethod获取指定的方法,该方法返回的是Method对象,然后通过Method里的invoke方法调用指定的方法。在调用的时候需要传入class实力化对象,有参数的话我们还需要传入参数。

public Object invoke(Object obj, Object... args)

源码显示,方法需要参数有多少这里就传入多少,这里是通用的。

在通过getMethod获取Method的时候我们需要传入方法参数的类型 public Object invoke(Object obj, Object... args) public Method getMethod(String name, Class>... parameterTypes)

获取所有构造函数(getConstructors)

Java类中最后应该还剩下构造函数了,既然是反射,我们就要将类反射的干干清爽的山水的。获得class对象后我们通过getConstructors获取构造函数,该方法返回的是Constructor集合。在Constructor类中getParameterTypes获取构造函数中的参数,有个这个我们就可以自己进行类的构造了。

总结

到这里我们的反射已经完全可以操作一个类了。有人会问这有啥意思呢,在我们Javaweb中,哪些知名的框架源码里必须有反射,通过反射我们能够实现注解这个功能。当然注解还有其他知识,以后知道在介绍。再比如说我们将map与实体进行映射这里就需要反射区获取Java Bean中的属性并将map的值赋值。不管怎么样,反射是我们Java的重要知识,学会它对自己以后的架构方面试有很大的帮助的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。