{"id":85297,"date":"2020-04-01T22:31:58","date_gmt":"2020-04-01T14:31:58","guid":{"rendered":"http:\/\/4563.org\/?p=85297"},"modified":"2020-04-01T22:31:58","modified_gmt":"2020-04-01T14:31:58","slug":"spring-%e4%b8%ad%e7%9a%84%e5%8f%8d%e5%b0%84%e4%b8%8e%e5%8f%8d%e5%b0%84%e7%9a%84%e5%8e%9f%e7%90%86","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=85297","title":{"rendered":"Spring \u4e2d\u7684\u53cd\u5c04\u4e0e\u53cd\u5c04\u7684\u539f\u7406"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1>                  Spring \u4e2d\u7684\u53cd\u5c04\u4e0e\u53cd\u5c04\u7684\u539f\u7406               <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : deppwxq <\/span>  <span><i><\/i> 8<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<p>\u4f5c\u8005\uff1aDeppWang\u3001\u539f\u6587\u5730\u5740<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200516_5ebfb9d34edaf.jpg\" alt=\"Spring \u4e2d\u7684\u53cd\u5c04\u4e0e\u53cd\u5c04\u7684\u539f\u7406\" \/><\/p>\n<p>\u5728\u9020\u8f6e\u5b50\uff1a\u5b9e\u73b0\u4e00\u4e2a\u7b80\u6613\u7684 Spring IoC \u5bb9\u5668\u4e00\u6587\u4e2d\u63d0\u5230 Spring \u5728\u521b\u5efa Bean \u5b9e\u4f8b\u548c\u4f9d\u8d56\u6ce8\u5165\u65f6\u4f7f\u7528\u4e86\u53cd\u5c04\uff0c\u672c\u6587\u6765\u5177\u4f53\u5206\u6790\u4e00\u4e0b Spring \u4e2d\u7684\u53cd\u5c04\u4ee5\u53ca\u53cd\u5c04\u7684\u539f\u7406\u3002<\/p>\n<h2>\u4e00\u3001Spring \u4e2d\u7684\u53cd\u5c04<\/h2>\n<h3>1.1 \u3001\u521b\u5efa Bean \u5b9e\u4f8b\u65f6\u7684\u53cd\u5c04<\/h3>\n<pre><code>\/\/ \u901a\u8fc7\u7c7b\u52a0\u8f7d\u5668\uff0c\u6839\u636e class \u8def\u5f84\uff0c\u5f97\u5230\u5176\u7c7b\u5bf9\u8c61 Class&lt;?&gt; clz = Thread.currentThread().getContextClassLoader().loadClass(\"org.deppwang.litespring.v1.service.PetStoreService\"); \/\/ \u6839\u636e\u7c7b\u5bf9\u8c61\u751f\u6210 Bean \u5b9e\u4f8b return clz.newInstance(); <\/code><\/pre>\n<p>\u53cd\u5c04\u4f53\u73b0\u5728 <code>clz.newInstance();<\/code> \u4e2d\uff0c\u6838\u5fc3\u4ee3\u7801\u53ef\u5206\u4e3a\u4e24\u90e8\u5206\uff1a<\/p>\n<p>1 \u3001<strong>\u5229\u7528\u53cd\u5c04<\/strong>\u83b7\u53d6\u5f53\u524d\u7c7b PetStoreService \u7684\u6240\u6709\u6784\u9020\u65b9\u6cd5\u4fe1\u606f\uff08 Constructor \u5bf9\u8c61\uff09<\/p>\n<pre><code>\/\/ java.lang.Class.java \/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0c\u6b64\u65f6 publicOnly \u4e3a false res = getDeclaredConstructors0(publicOnly); \/\/ native \u65b9\u6cd5\uff0c\u4ece jvm \u4e2d\u7684 class \u6587\u4ef6\u4e2d\u83b7\u53d6\u6784\u9020\u65b9\u6cd5\u4fe1\u606f\uff0c\u518d\u8f6c\u6362\u4e3a Constructor \u5bf9\u8c61 private native Constructor&lt;T&gt;[] getDeclaredConstructors0(boolean publicOnly); <\/code><\/pre>\n<p>2 \u3001<strong>\u5229\u7528\u53cd\u5c04<\/strong>\u901a\u8fc7\u9ed8\u8ba4\u6784\u9020\u65b9\u6cd5\u751f\u6210\u5b9e\u4f8b<\/p>\n<pre><code>\/\/ sun.reflect.NativeConstructorAccessorImpl.java \/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0cvar1 \u4ee3\u8868\u6784\u9020\u65b9\u6cd5\u7684\u53c2\u6570\uff0c\u6b64\u65f6\u4e3a null return newInstance0(this.c, var1); \/\/ native \u65b9\u6cd5\uff0c\u771f\u6b63\u751f\u6210\u5b9e\u4f8b\u7684\u65b9\u6cd5\uff0c\u6267\u884c class \u6587\u4ef6\u7684\u6784\u9020\u65b9\u6cd5 &lt;init&gt; private static native Object newInstance0(Constructor&lt;?&gt; var0, Object[] var1); <\/code><\/pre>\n<h3>1.2 \u3001\u6784\u9020\u65b9\u6cd5\u4f9d\u8d56\u6ce8\u5165\u65f6\u7684\u53cd\u5c04<\/h3>\n<pre><code>\/\/ \u901a\u8fc7\u53cd\u5c04\u83b7\u53d6\u5f53\u524d\u7c7b\u6240\u6709\u7684\u6784\u9020\u65b9\u6cd5\u4fe1\u606f\uff08 Constructor \u5bf9\u8c61\uff09 Constructor&lt;?&gt;[] candidates = beanClass.getDeclaredConstructors(); \/\/ \u8bbe\u7f6e\u6784\u9020\u65b9\u6cd5\u53c2\u6570\u5b9e\u4f8b Object[] argsToUse = new Object[parameterTypes.length]; argsToUse[i] = getBean(beanNames.get(i)); \/\/ \u4f7f\u7528\u5e26\u6709\u53c2\u6570\u7684 Constructor \u5bf9\u8c61\u5b9e\u73b0\u5b9e\u4f8b\u5316 Bean \u3002\u6b64\u65f6\u4f7f\u7528\u53cd\u5c04\u8ddf\u4e0a\u9762\u4e00\u6837\uff08 newInstance0 \uff09\uff0c\u53ea\u662f\u591a\u4e86\u53c2\u6570 return constructorToUse.newInstance(argsToUse); <\/code><\/pre>\n<h3>1.3 \u3001setter() \u65b9\u6cd5\u4f9d\u8d56\u6ce8\u5165\u65f6\u7684\u53cd\u5c04<\/h3>\n<pre><code>\/\/ \u901a\u8fc7\u53cd\u5c04\u83b7\u53d6\u5f53\u524d\u7c7b\u6240\u6709\u7684\u65b9\u6cd5\u4fe1\u606f\uff08 Method \u5bf9\u8c61\uff09 Method[] methods = bean.getClass().getDeclaredMethods(); \/\/ \u83b7\u5f97\u65b9\u6cd5\u53c2\u6570\u5b9e\u4f8b Object propertyBean = getBean(propertyName); \/\/ \u901a\u8fc7\u53cd\u5c04\u6267\u884c\u8c03\u7528 setter() \u65b9\u6cd5\u3002invoke\uff1a\u8c03\u7528\u65b9\u6cd5\uff0cpropertyBean \u4f5c\u4e3a\u65b9\u6cd5\u7684\u53c2\u6570 method.invoke(bean, propertyBean); <\/code><\/pre>\n<p>bean.getClass().getDeclaredMethods(); \u4e2d\u7684\u6838\u5fc3\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/ java.lang.Class.java \/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0cpublicOnly \u4e3a false getDeclaredMethods0(publicOnly); \/\/ native \u65b9\u6cd5\uff0c\u4ece jvm \u4e2d\u7684 class \u6587\u4ef6\u4e2d\u83b7\u53d6\u65b9\u6cd5\u4fe1\u606f\uff0c\u518d\u8f6c\u6362\u4e3a Method private native Method[]      getDeclaredMethods0(boolean publicOnly); <\/code><\/pre>\n<p>method.invoke(bean, propertyBean); \u4e2d\u7684\u6838\u5fc3\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/ sun.reflect.NativeMethodAccessorImpl.java \/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0cvar1: bean \u3001var2: propertyBean return invoke0(this.method, var1, var2); \/\/ native \u65b9\u6cd5\uff0c\u8fd0\u884c class \u6587\u4ef6\u4e2d\u7684\u5b57\u8282\u7801\u6307\u4ee4 private static native Object invoke0(Method var0, Object var1, Object[] var2); <\/code><\/pre>\n<h3>1.4 \u3001 @Autowired \u4f9d\u8d56\u6ce8\u5165\u65f6\u7684\u53cd\u5c04<\/h3>\n<pre><code>\/\/ \u901a\u8fc7\u53cd\u5c04\u5f97\u5230\u5f53\u524d\u7c7b\u6240\u6709\u7684\u5b57\u6bb5\u4fe1\u606f\uff08 Field \u5bf9\u8c61\uff09 Field[] fields = bean.getClass().getDeclaredFields(); \/\/ \u5224\u65ad\u5b57\u6bb5\u662f\u5426\u6709 @Autowired \u6ce8\u89e3 Annotation ann = field.getAnnotation(Autowired.class); \/\/ \u8bbe\u7f6e\u5b57\u6bb5\u53ef\u8fde\u63a5\uff0c\u76f8\u5f53\u4e8e\u5c06\u975e public \uff08 private \u3001default \u3001protect \uff09\u66f4\u6539\u4e3a public field.setAccessible(true); \/\/ \u901a\u8fc7\u53cd\u5c04\u8bbe\u7f6e\u5b57\u6bb5\u7684\u503c field.set(bean, getBean(field.getName())); <\/code><\/pre>\n<p>bean.getClass().getDeclaredFields(); \u4e2d\u7684\u6838\u5fc3\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/ java.lang.Class.java \/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0c\u6b64\u65f6 publicOnly \u4e3a false getDeclaredFields0(publicOnly); \/\/ native \u65b9\u6cd5\uff0c\u4ece jvm \u4e2d\u83b7\u53d6 class \u6587\u4ef6\u7684\u5b57\u6bb5\u4fe1\u606f\uff0c\u518d\u8f6c\u6362\u4e3a Field private native Field[]       getDeclaredFields0(boolean publicOnly); <\/code><\/pre>\n<p>field.set(bean, getBean(field.getName())); \u4e2d\u7684\u6838\u5fc3\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/ sun.reflect.UnsafeObjectFieldAccessorImpl.java \/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0c\u5c06\u76ee\u6807\u5bf9\u8c61 var1 \u6307\u5b9a\u504f\u79fb\u91cf fieldOffset \u5904\u7684\u5b57\u6bb5\u503c\u8bbe\u7f6e\uff08\u4fee\u6539\uff09\u4e3a var2 \u3002var1 \u4e3a bean, var2 \u4e3a\u53c2\u6570\u5b9e\u4f8b unsafe.putObject(var1, this.fieldOffset, var2);  \/\/ sun.misc.Unsafe.java \/\/ native \u65b9\u6cd5\uff0c\u76f4\u63a5\u4fee\u6539\u5806\u4e2d\u5bf9\u8c61\u5b57\u6bb5\u7684\u6570\u636e public native void putObject(Object var1, long var2, Object var4); <\/code><\/pre>\n<h2>\u4e8c\u3001class \u6587\u4ef6\u4e0e\u7c7b\u5bf9\u8c61<\/h2>\n<p>class \u6587\u4ef6\u7531 java \u6587\u4ef6\u7f16\u8bd1\u800c\u6765\uff0cclass \u6587\u4ef6\u5305\u542b\u5b57\u6bb5\u8868\u3001\u65b9\u6cd5\u8868\u3001<code>&lt;init&gt;<\/code> \u65b9\u6cd5\uff08\u6784\u9020\u65b9\u6cd5\uff09\u7b49\u3002<\/p>\n<p>\u5f53\u7c7b\u52a0\u8f7d\u5668\u5c06 class \u6587\u4ef6\u52a0\u8f7d\u8fdb\u865a\u62df\u673a\u5143\u6570\u636e\u533a\uff08\u65b9\u6cd5\u533a\uff0cjdk1.7 \uff09\u65f6\uff0c\u865a\u62df\u673a\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u5bf9\u5e94\u7684\u7c7b\u5bf9\u8c61\uff08 Class \u5b9e\u4f8b\uff09\u3002\u5e76\u5c06 class \u6587\u4ef6\u7531\u5b58\u653e\u5728\u78c1\u76d8\u7684\u9759\u6001\u7ed3\u6784\u8f6c\u6362\u4e3a\u5b58\u653e\u5728\u5185\u5b58\u7684\u8fd0\u884c\u65f6\u7ed3\u6784\u3002<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u8ba4\u4e3a\u4e00\u4e2a\u7c7b\uff08 class \u6587\u4ef6\uff09\u5bf9\u5e94\u4e00\u4e2a\u7c7b\u5bf9\u8c61\uff0c\u5f53\u524d\u7c7b\u7684\u6240\u6709\u5bf9\u8c61\u5171\u7528\u4e00\u4e2a\u7c7b\u5bf9\u8c61\u3002<strong>\u7c7b\u5bf9\u8c61\u4f5c\u4e3a\u8bbf\u95ee\u5b58\u653e\u5728 jvm \u7684 class \u6587\u4ef6\u7684\u5165\u53e3\u3002<\/strong><\/p>\n<pre><code>package java.lang; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Constructor;  public final class Class&lt;T&gt; {     private native Field[]       getDeclaredFields0(boolean publicOnly);     private native Method[]      getDeclaredMethods0(boolean publicOnly);     private native Constructor&lt;T&gt;[] getDeclaredConstructors0(boolean publicOnly);      \/\/ ReflectionData \u7f13\u5b58\u53cd\u5c04\u5bf9\u8c61     private static class ReflectionData&lt;T&gt; {         volatile Field[] declaredFields;         volatile Field[] publicFields;         volatile Method[] declaredMethods;         volatile Method[] publicMethods;         volatile Constructor&lt;T&gt;[] declaredConstructors;         volatile Constructor&lt;T&gt;[] publicConstructors;         ...     } } <\/code><\/pre>\n<h3>2.1 \u3001\u83b7\u5f97\u7c7b\u5bf9\u8c61\u7684\u65b9\u5f0f<\/h3>\n<pre><code>\/\/ 1 \u3001\u901a\u8fc7\u5bf9\u8c61 Class cls = object.getClass(); \/\/ Object.java public final native Class&lt;?&gt; getClass();  \/\/ 2 \u3001\u901a\u8fc7\u7c7b\u52a0\u8f7d\u5668 Class cls = Thread.currentThread().getContextClassLoader().loadClass(\"org.deppwang.litespring.v1.service.PetStoreService\");  \/\/ 3 \u3001\u901a\u8fc7 Class \u7c7b\uff0c\u672c\u8d28\u4e0a\u4e5f\u662f\u901a\u8fc7\u7c7b\u52a0\u8f7d\u5668 Class cls = Class.forName(\"org.deppwang.litespring.v1.service.PetStoreService\"); \/\/ Class.java private static native Class&lt;?&gt; forName0(String name, boolean initialize,                                             ClassLoader loader,                                             Class&lt;?&gt; caller) <\/code><\/pre>\n<h2>\u4e09\u3001\u53cd\u5c04\u65b9\u6cd5<\/h2>\n<p>\u4ee5\u4e0b\u662f\u5e38\u7528\u7684\u53cd\u5c04\u65b9\u6cd5\u3002<\/p>\n<h3>3.1 \u3001Feild \u76f8\u5173<\/h3>\n<pre><code>Field[] fields = cls.getFields(); \/\/ \u83b7\u53d6\u6240\u6709\u516c\u5171\u7684 Field \uff08\u5305\u62ec\u7236\u7c7b\uff09 Field[] fields = cls.getDeclaredFields(); \/\/ \u83b7\u53d6\u5f53\u524d\u7c7b\u7684\u6240\u6709 Field \uff08\u4e0d\u5305\u62ec\u7236\u7c7b\uff09\uff0c\u5305\u62ec\u516c\u5171\u548c\u975e\u516c\u5171 Field field = cls.getDeclaredField(\"fieldName\"); \/\/ \u6307\u5b9a\u83b7\u53d6\u5f53\u524d\u7c7b\u67d0\u4e2a Field field.set(Object, Object); \/\/ \u8bbe\u7f6e\uff08\u4fee\u6539\uff09\u5b57\u6bb5\u503c field.get(Object); \/\/ \u83b7\u53d6\u5b57\u6bb5\u503c <\/code><\/pre>\n<p>field.get(Object) \u6838\u5fc3\u4ee3\u7801\uff1a<\/p>\n<pre><code>\/\/ \u8c03\u7528 native \u65b9\u6cd5\uff0c\u83b7\u53d6\u5b57\u6bb5\u5bf9\u5e94\u7684\u503c return unsafe.getObject(var1, this.fieldOffset);  \/\/ native \u65b9\u6cd5\uff0c\u4ece\u5806\u4e2d\u83b7\u53d6\u5bf9\u8c61\u6307\u5b9a\u4f4d\u7f6e\u7684\u5bf9\u8c61 public native Object getObject(Object var1, long var2); <\/code><\/pre>\n<h3>3.2 \u3001Method \u76f8\u5173<\/h3>\n<pre><code>Method[] methods = cls.getMethods(); \/\/ \u83b7\u53d6\u6240\u6709\u516c\u5171\u7684 Method \uff08\u5305\u62ec\u7236\u7c7b\uff09 Method[] methods = cls.getDeclaredMethods(); \/\/ \u83b7\u53d6\u5f53\u524d\u7c7b\u7684\u6240\u6709 Method \uff08\u4e0d\u5305\u62ec\u7236\u7c7b\uff09\uff0c\u5305\u62ec\u516c\u5171\u548c\u975e\u516c\u5171 method.invoke(Object instance, Object... parameters); \/\/ \u8fd0\u884c\u65b9\u6cd5 <\/code><\/pre>\n<p>\u8fd0\u884c\u65b9\u6cd5\u4f7f\u7528\u573a\u666f\uff1a\u8981\u4e48\u662f\u4fee\u6539\u5bf9\u8c61\u7684\u6570\u636e\uff0c\u5982 void setter() \u65b9\u6cd5\uff1b\u8981\u4e48\u662f\u83b7\u5f97\u6267\u884c\u65b9\u6cd5\u7684\u8fd4\u56de\u7ed3\u679c\u3002<\/p>\n<pre><code>String result = method.invoke().toString(); <\/code><\/pre>\n<h3>3.3 \u3001Constructor \u76f8\u5173<\/h3>\n<pre><code>Constructor&lt;?&gt;[] constructors = cls.getConstructors(); \/\/ \u83b7\u53d6\u6240\u6709\u516c\u5171\u7684 Constructor \uff08\u5305\u62ec\u7236\u7c7b\uff09 Constructor&lt;?&gt;[] constructors = cls.getDeclaredConstructors(); \/\/ \u83b7\u53d6\u5f53\u524d\u7c7b\u7684\u6240\u6709 Constructor \uff08\u4e0d\u5305\u62ec\u7236\u7c7b\uff09\uff0c\u5305\u62ec\u516c\u5171\u548c\u975e\u516c\u5171 constructor.newInstance(Object... parameters); \/\/ \u8fd0\u884c\u6784\u9020\u65b9\u6cd5 <\/code><\/pre>\n<p>\u5f53\u6ca1\u6709\u660e\u786e\u7f16\u5199\u6784\u9020\u65b9\u6cd5\uff0cJava \u7f16\u8bd1\u5668\u5c06\u4e3a\u8be5\u7c7b\u6784\u5efa\u4e00\u4e2a\u9ed8\u8ba4\u6784\u9020\u51fd\u6570 <code>&lt;init&gt;<\/code><\/p>\n<h2>\u56db\u3001native \u65b9\u6cd5<\/h2>\n<p>Java 1.1 \u65b0\u589e\u300c Java \u672c\u5730\u63a5\u53e3\u300d(Java Native Interface\uff0cJNI)\uff0cJNI \u662f\u4e00\u79cd\u5305\u5bb9\u6781\u5e7f\u7684\u7f16\u7a0b\u63a5\u53e3\uff0c\u5141\u8bb8\u6211\u4eec\u4ece Java \u5e94\u7528\u7a0b\u5e8f\u91cc\u8c03\u7528 native \u65b9\u6cd5\uff0cnative \u65b9\u6cd5\u7531\u5176\u5b83\u8bed\u8a00\uff08 C \u3001C++ \u6216\u6c47\u7f16\u8bed\u8a00\u7b49\uff09\u7f16\u5199\u3002native \u65b9\u6cd5\u7528\u4e8e\u5b9e\u73b0 Java \u65e0\u6cd5\u5904\u7406\u7684\u529f\u80fd\u3002<\/p>\n<h3>4.1 \u3001\u7b80\u5355\u793a\u4f8b<\/h3>\n<p>\u4e00\u4e2a\u5728 Java \u4e2d\u4f7f\u7528 Java \u672c\u5730\u63a5\u53e3\uff08 JNI \uff09\u7684\u7b80\u5355\u793a\u4f8b\u3002<\/p>\n<ul>\n<li>\u73af\u5883\uff1a<strong>jdk8 \u3001macOS 10.15<\/strong><\/li>\n<\/ul>\n<pre><code>\/\/ Main.java public class Main {     public native int intMethod(int i);     static {         \/\/ \u542f\u52a8\u65f6\u8f7d\u5165 libMain.dylib         System.loadLibrary(\"Main\");     }     public static void main(String[] args) {         System.out.println(new Main().intMethod(2));     } } <\/code><\/pre>\n<pre><code>\/\/ Main.c: \/\/ \u5c06 Main.h \u5f15\u5165 #include \"Main.h\"  \/\/ \u76f8\u5f53\u4e8e\u7ee7\u627f \"Main.h\" \u7684 Java_Main_intMethod JNIEXPORT jint JNICALL Java_Main_intMethod(     JNIEnv *env, jobject obj, jint i) {     return i * i; } <\/code><\/pre>\n<p>\u7f16\u8bd1\u4e0e\u8fd0\u884c:<\/p>\n<pre><code>\/\/ \u540c\u65f6\u751f\u6210 Main.class \u548c Main.h javac Main.java -h . \/\/ \u6839\u636e Main.c \u751f\u6210 libMain.dylib gcc -dynamiclib -O3      -I\/usr\/include      -I$JAVA_HOME\/include      -I$JAVA_HOME\/include\/darwin      Main.c -o libMain.dylib \/\/ \u6307\u5b9a library \u7684\u8def\u5f84\u4e3a\u5f53\u524d\u8def\u5f84 java -cp . -Djava.library.path=$(pwd) Main <\/code><\/pre>\n<p>\u8f93\u51fa:<\/p>\n<pre><code>4 <\/code><\/pre>\n<pre><code>\/* Main.h .h \u4f5c\u4e3a\u5934\u6587\u4ef6*\/ \/* DO NOT EDIT THIS FILE - it is machine generated *\/ #include &lt;jni.h&gt; \/* Header for class Main *\/  #ifndef _Included_Main #define _Included_Main #ifdef __cplusplus extern \"C\" { #endif \/*  * Class:     Main  * Method:    intMethod  * Signature: (I)I  *\/ JNIEXPORT jint JNICALL Java_Main_intMethod   (JNIEnv *, jobject, jint);  #ifdef __cplusplus } #endif #endif <\/code><\/pre>\n<pre><code>javac Main.java -h . \/\/ \u53ef\u62c6\u5206\u4e3a\u4e24\u4e2a\u547d\u4ee4 javac Main.java javah -jni Main <\/code><\/pre>\n<h3>4.2 \u3001\u539f\u7406<\/h3>\n<p>\u8fd0\u884c Main.class \u65f6\uff0c\u5c06 libMain.dylib \u8f7d\u5165\u865a\u62df\u673a\uff0cJVM \u8c03\u7528 libMain.dylib \u7684 Java_Main_intMethod\uff0c\u4f20\u5165\u53c2\u6570\uff0clibMain.dylib \u7531\u7cfb\u7edf\u76f4\u63a5\u8fd0\u884c\uff0c\u8fd4\u56de\u7ed3\u679c\u3002<\/p>\n<ul>\n<li>*env \u7528\u4e8e\u5c06 java \u7c7b\u578b\u6570\u636e\u4e0e\u672c\u5730\uff08\u6b64\u5904\u4e3a C \u8bed\u8a00\uff09\u7c7b\u578b\u6570\u636e\u4e4b\u95f4\u7684\u8f6c\u6362<\/li>\n<li>jint \u8fd8\u662f Java \u6570\u636e\u7c7b\u578b\uff0cJava \u57fa\u672c\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u6620\u5c04\uff08\u4f7f\u7528\uff09\uff0c\u4e0d\u7528\u901a\u8fc7 *env \u8f6c\u6362<\/li>\n<\/ul>\n<pre><code>\/*C code*\/ JNIEXPORT void JNICALL Java_ClassName_MethodName   (JNIEnv *env, jobject obj, jstring javaString) {     \/*Get the native string from javaString*\/     const char *nativeString = (*env)-&gt;GetStringUTFChars(env, javaString, 0);      \/*Do something with the nativeString*\/      \/*DON'T FORGET THIS LINE!!!*\/     (*env)-&gt;ReleaseStringUTFChars(env, javaString, nativeString); } <\/code><\/pre>\n<h3>4.3 \u3001\u53c2\u8003<\/h3>\n<ul>\n<li>A Simple Java Native Interface (JNI) example in Java and Scala<\/li>\n<li>Java native keyword example<\/li>\n<li>Java Native Interface: JNI Example<\/li>\n<li>[Java \u7f16\u7a0b\u601d\u60f3 &#8211; \u9644\u5f55<strong>A<\/strong> \u4f7f\u7528\u975e<strong>JAVA<\/strong>\u4ee3\u7801]( https:\/\/depp.wang\/Java-Books\/docs\/Java \u7f16\u7a0b\u601d\u60f3.pdf)<\/li>\n<li>[Java \u672c\u5730\u63a5\u53e3 &#8211; WiKi]( https:\/\/zh.wikipedia.org\/wiki\/Java \u672c\u5730\u63a5\u53e3)<\/li>\n<\/ul>\n<h2>\u4e94\u3001\u603b\u7ed3<\/h2>\n<p>\u53cd\u5c04\u53cd\u5c04\uff0c\u54ea\u91cc\u4f53\u73b0\u53cd\u5c04\u5b57\u9762\u610f\u601d\uff1f<\/p>\n<p>\u53ef\u4ee5\u8fd9\u4e48\u7406\u89e3\uff0c\u901a\u8fc7 native \u65b9\u6cd5\u5f97\u5230\u53cd\u5c04\u5bf9\u8c61\uff0c\u64cd\u4f5c\u53cd\u5c04\u5bf9\u8c61\uff0c\u50cf\u955c\u5b50\u4e00\u6837\uff0c\u5c06\u53cd\u5c04\u5230\u539f\u5bf9\u8c61\u4e0a\u3002<\/p>\n<p>\u6211\u4eec\u53d1\u73b0\uff0c\u53cd\u5c04\u548c native \u65b9\u6cd5\u7684\u5173\u7cfb\uff1a<\/p>\n<ul>\n<li>\u83b7\u53d6\u5b57\u6bb5\u3001\u65b9\u6cd5\u3001\u6784\u9020\u65b9\u6cd5\u5bf9\u8c61\uff0cnative() \u65b9\u6cd5\u5b9e\u73b0<\/li>\n<li>\u83b7\u53d6\u5b57\u6bb5\u503c\u3001\u8bbe\u7f6e\u4fee\u6539\u5b57\u6bb5\u503c\uff0cnative() \u65b9\u6cd5\u5b9e\u73b0<\/li>\n<li>\u8fd0\u884c\u65b9\u6cd5\uff0cnative() \u65b9\u6cd5\u5b9e\u73b0<\/li>\n<li>\u8fd0\u884c\u6784\u9020\u65b9\u6cd5\uff0cnative() \u65b9\u6cd5\u5b9e\u73b0<\/li>\n<\/ul>\n<p>\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u7ed3\u8bba\uff0c<strong>\u53cd\u5c04\u7531 native \u65b9\u6cd5\u5b9e\u73b0<\/strong>\u3002<\/p>\n<p>\u6211\u4eec\u8bf4\u901a\u8fc7\u53cd\u5c04\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u8bf4<\/p>\n<ul>\n<li>\u901a\u8fc7\u53cd\u5c04\u65b9\u6cd5\u5b9e\u73b0<\/li>\n<li>\u901a\u8fc7\u53cd\u5c04 API \u5b9e\u73b0<\/li>\n<li>\u901a\u8fc7 native \u65b9\u6cd5\u5b9e\u73b0<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200516_5ebfb9d51a813.png\" alt=\"Spring \u4e2d\u7684\u53cd\u5c04\u4e0e\u53cd\u5c04\u7684\u539f\u7406\" \/><\/p>\n<p>\u53cd\u5c04\u662f\u4e00\u79cd\u975e\u5e38\u89c4\uff08 native \u65b9\u6cd5\u5b9e\u73b0\uff09\u65b9\u5f0f\u83b7\u53d6 class \u6587\u4ef6\u4fe1\u606f\u3001\u8fd0\u884c class \u6587\u4ef6\u5b57\u8282\u7801\u6307\u4ee4\u548c\u64cd\u4f5c\u5bf9\u8c61\u6570\u636e\u7684\u80fd\u529b\u3002<\/p>\n<p>\u4e00\u53e5\u8bdd\u603b\u7ed3 \uff1a\u53cd\u5c04\u662f\u4e00\u79cd\u8fd0\u884c\u65f6<strong>\u83b7\u53d6\u548c\u4fee\u6539<\/strong>\u5bf9\u8c61\u6570\u636e\u7684\u80fd\u529b\u3002<\/p>\n<p>\u5173\u4e8e\u8fd0\u884c\u65f6\uff1aJava \u662f\u9759\u6001\u8bed\u8a00\uff0c\u5148\u7f16\u8bd1\uff0c\u540e\u8fd0\u884c\u3002\u7f16\u8bd1\u65f6\u4e0d\u6267\u884c\u4ee3\u7801\uff0c\u4ee3\u7801\u90fd\u662f\u8fd0\u884c\u65f6\u6267\u884c\u3002<\/p>\n<h2>\u516d\u3001\u5ef6\u4f38\u9605\u8bfb<\/h2>\n<ul>\n<li>JAVA \u53cd\u5c04\u539f\u7406<\/li>\n<li>\u5ed6\u96ea\u5cf0 Java \u6559\u7a0b &#8211; \u53cd\u5c04<\/li>\n<li>Reflection in Java<\/li>\n<li>oracle reflect docs<\/li>\n<li>What is reflection and why is it useful?<\/li>\n<li>Understanding sun.misc.Unsafe<\/li>\n<li>Guide to sun.misc.Unsafe<\/li>\n<\/ul><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>0<\/span>)        <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>Spring \u4e2d\u7684\u53cd\u5c04\u4e0e\u53cd\u5c04\u7684\u539f\u7406&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/85297"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=85297"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/85297\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=85297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=85297"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=85297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}