C反射java代码,JAVA 反射
C回调java几种方法
C代码回调java方法
创新互联专业为企业提供安宁网站建设、安宁做网站、安宁网站设计、安宁网站制作等企业网站建设、网页设计与制作、安宁企业网站模板建站服务,10余年安宁做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
① 找到字节码对象
//jclass (FindClass)(JNIEnv, const char*);
//第二个参数 要回调的java方法所在的类的路径 "com/itheima/callbackjava/JNI"
② 通过字节码对象找到方法对象
//jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);
第二个参数 字节码对象 第三个参数 要反射调用的java方法名 第四个参数 要反射调用的java方法签名
javap -s 要获取方法签名的类的全类名 项目/bin/classes 运行javap
③ 通过字节码创建 java对象(可选) 如果本地方法和要回调的java方法在同一个类里可以直接用 jni传过来的java对象 调用创建的Method
jobject obj =(*env)-AllocObject(env,claz);
当回调的方法跟本地方法不在一个类里 需要通过刚创建的字节码对象手动创建一个java对象
再通过这个对象来回调java的方法
需要注意的是 如果创建的是一个activity对象 回调的方法还包含上下文 这个方法行不通!!!回报空指针异常
④ 反射调用java方法
//void (CallVoidMethod)(JNIEnv, jobject, jmethodID, ...);
第二个参数 调用java方法的对象 第三个参数 要调用的jmethodID对象 可选的参数 调用方法时接收的参数
把C语言代码转成Java代码
package dis;
import java.io.*;
import java.math.*;
public class dis
{
public static void main(String [] s) throws Exception
{
Float a,b,c;
double x2;
double x1;
System.out.println("请输入a, b, c的值");
BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
a=Float.parseFloat(bReader.readLine());
b=Float.parseFloat(bReader.readLine());
c=Float.parseFloat(bReader.readLine());
if (b*b - 4*a*c = 0)
System.out.println("输入的系数不对,b2-4ac不大于0!程序退出!");
else
{
x1 = (-b + Math.sqrt(b*b - 4*a*c))/2*a;
x2 = (-b - Math.sqrt(b*b - 4*a*c))/2*a;
System.out.println("x1 = "+ x1);
System.out.println("x2 = "+x2);
}
return;
}
}
java中的反射怎么用c实现
不难么?!我认为C语言应该事先不了反射的,即使所谓的实现也不是真正的动态。
Java反射有很多场景:1、最简单的是通过字符串(类名)在运行时加载一个类然后产生调用;2、更复杂的包括从类里面获取方法、field信息,然后产生强制调用。
这些东西依赖的核心是class文件结构,以1为例,java文件编译好了之后他的包路径和其类全名完全一致,所以很容易通过字符串搜索一个类,而C语言编译好了之后都是obj文件,这个二进制文件中不存在什么名字信息,所有的东西都变成二进制码了;第一个还好说,第二种情况则更不可能,Java要想动态获取类中的方法,其前提是class文件中这些方法、field的定义信息都还在,如果不在的话你如何获取?如何调用。以调用为例,假设你想调用add方法,可人家编译好的obj文件中不存在add方法的原始声明啊!C语言中要求调用其他文件中的东东还必须在我这几这边手工写好外部声明的原因与此类似。
总之,我觉得不太可能实现反射。要想实现反射,必须保证其编译后的文件中,源码信息不丢失,否则反不过来。换句话说,具有反射能力的语言比如是依赖虚拟机运行的。注,这里面的虚拟机不仅仅是jre的,.net的framework本质上也是虚拟机。
个人理解.
名称栏目:C反射java代码,JAVA 反射
本文链接:http://myzitong.com/article/dseojhs.html