java反射机制和回调
java反射机制
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象的方法的功能成为java语言的反射机制。
java的反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;生成动态代理。
获取class的三种方式
- Class.forName(“com.weige.Test”);
- Test.class;
- new Test().getClass();
通过属性来调用对象
public static void main(String[] args) throws Exception{
Class<?> a = new Test().getClass();
Test test = new Test("456");
Field field= a.getDeclaredField("age");
field.set(test, "123");
System.out.println(field.get(test));
}
打印结果:
123
通过方法调用对象
public static void main(String[] args) throws Exception{
Class<?> a = new Test().getClass();
Method method = a.getDeclaredMethod("say", String.class,int.class);
method.invoke(a.newInstance(), "asd",1);
}
private static void say(String a,int b) {
System.out.println("测试"+a+b);
}
打印结果:
测试asd1
函数的回调
回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
在Java里面,我们使用接口来实现回调。
程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
假设我是程序员A,以下是我的程序a:
public class Caller
{
public MyCallInterface mc;
public void setCallfuc(MyCallInterface mc)
{
this.mc= mc;
}
public void call(){
this.mc.method();
}
}
我还需要定义一个接口,以便程序员B根据我的定义编写程序实现接口。
public interface MyCallInterface
{
public void method();
}
于是,程序员B只需要实现这个接口就能达到回调的目的了:
public class B implements MyCallInterface
{
public void method()
{
System.out.println("回调");
}
public static void main(String args[])
{
Caller call = new Caller();
call.setCallfuc(new B());
call.call();
}
}
关于回调函数,多看几遍实例代码,还是能够很好的理解的。主要就是回调者需要实现一个回调接口,然后把自己,也就是相当于接口当做参数传给别人,别人拿到这个接口之后,最终都会调用接口中的方法,就相当于执行了回调方法。