你好,我写了个很简单的代码,你一看就明白了
创新互联是工信部颁发资质IDC服务器商,为用户提供优质的托管服务器服务
public class A {
int value = 1001;
public A() {// A的构造函数,执行B的exec()方法,里面又带有对A的getValue()方法调用,这个就叫做回调
B b = new B(this);
b.exec();
}
public int getValue() {
return value;
}
public static void main(String[] args) {
new A();//构造函数里已经发生了回调,所以不需要更多的代码
}
}
class B {
private A a;
public B(A a) {
this.a = a;
}
public void exec() {
System.out.println(a.getValue());// 这里调用了a的getValue()方法
}
}
这是一个C++中获得虚拟机的example,是在JDK 1.1中实现的,现在已经跑不通了,经供参考,但是里面得到虚拟机原理是一样的。
它用到了3个方法: Create VM,Attaching VM,Unloading VM.
JNI_CreateJavaVM() 方法用来加载和初始化一个java虚拟机并且返回JNI接口的指针(JNIEnv), 这个线程被看做是主线程。
JNIEnv是在当前线程中是合法的,如果其他的线程去访问java虚拟机,他必须调用一下AttachCurrentThread()方法,把自己附属到VM中才能获得JNIEnv。一旦调用成功,native的线程就像一个普通的java线程运行在native的线程中(native中的线程都是Linux线程,由内核调用执行)。native线程仍然连接到VM,直到它调用DetachCurrentThread()来分离。
主线程不能从VM中分离自己,必须调用DestroyJavaVM()方法去卸载整个VM。
接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。
示例代码:
interface People{ //接口
void peopleList();
}
class Student implements People{ //接口实现类
public void peopleList(){ //实现接口方法
System.out.println("I'm a student.");
}
}
class Teacher implements People{ //接口实现类
public void peopleList(){ //实现接口方法
System.out.println("I'm a teacher.");
}
}
public class Example{
public static void main(String args[]){
People a; //声明接口变量
a=new Student(); //实例化,接口变量中存放对象的引用
a.peopleList(); //接口回调
a=new Teacher(); //实例化,接口变量中存放对象的引用
a.peopleList(); //接口回调
}
}
输出结果:
I’m a student.
I’m a teacher.
程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。\x0d\x0a假设我是程序员A,以下是我的程序a:\x0d\x0a[java]viewplaincopyprint?\x0d\x0apublicclassCaller\x0d\x0a{\x0d\x0apublicMyCallInterfacemc;\x0d\x0a\x0d\x0apublicvoidsetCallfuc(MyCallInterfacemc)\x0d\x0a{\x0d\x0athis.mc=mc;\x0d\x0a}\x0d\x0a\x0d\x0apublicvoidcall(){\x0d\x0athis.mc.method();\x0d\x0a}\x0d\x0a}\x0d\x0a还需要定义一个接口,以便程序员B根据我的定义编写程序实现接口。\x0d\x0a\x0d\x0apublicinterfaceMyCallInterface\x0d\x0a{\x0d\x0apublicvoidmethod();\x0d\x0a\x0d\x0a}\x0d\x0a于是,程序员B只需要实现这个接口就能达到回调的目的了:\x0d\x0apublicclassBimplementsMyCallInterface\x0d\x0a{\x0d\x0apublicvoidmethod()\x0d\x0a{\x0d\x0aSystem.out.println("回调");\x0d\x0a}\x0d\x0a\x0d\x0apublicstaticvoidmain(Stringargs[])\x0d\x0a{\x0d\x0aCallercall=newCaller();\x0d\x0acall.setCallfuc(newB());\x0d\x0acall.call();\x0d\x0a}\x0d\x0a}
public class Caller
{
public MyCallInterface mc;
public void setCallfuc(MyCallInterface mc)
{
this.mc= mc;
}
public void call(){
this.mc.method();
}
}
接口
public interface MyCallInterface
{
public void method();
}
测试
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();
}
}