From 7fe0fe0d473eff4f862c5e2bb3ff6d47ab1b4590 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Wed, 13 Apr 2016 16:12:03 +0800 Subject: [PATCH] --- src/org/redkale/net/sncp/Sncp.java | 86 +++++++++++++++++------------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index 1a79aa181..02ea4d82e 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -5,27 +5,27 @@ */ package org.redkale.net.sncp; -import org.redkale.net.sncp.SncpClient.SncpAction; -import java.lang.annotation.*; +import java.lang.annotation.Annotation; import java.lang.reflect.*; -import java.net.*; +import java.net.InetSocketAddress; import java.security.*; import java.util.*; -import java.util.function.*; -import jdk.internal.org.objectweb.asm.*; +import java.util.function.Consumer; +import javax.annotation.Resource; import static jdk.internal.org.objectweb.asm.ClassWriter.COMPUTE_FRAMES; +import jdk.internal.org.objectweb.asm.*; import static jdk.internal.org.objectweb.asm.Opcodes.*; import jdk.internal.org.objectweb.asm.Type; -import org.redkale.convert.bson.*; -import org.redkale.net.*; +import org.redkale.convert.bson.BsonConvert; +import org.redkale.net.Transport; +import org.redkale.net.sncp.SncpClient.SncpAction; import org.redkale.service.*; import org.redkale.util.*; -import org.redkale.service.DynRemote; /** * Service Node Communicate Protocol * 生成Service的本地模式或远程模式Service-Class的工具类 - * + *

*

* 详情见: http://redkale.org * @@ -96,50 +96,50 @@ public abstract class Sncp { /** *

      * public class TestService implements Service{
-     *
+     * 

* public String findSomeThing(){ * return "hello"; * } - * + *

* @MultiRun(selfrun = false) * public void createSomeThing(TestBean bean){ * //do something * } - * + *

* @MultiRun * public String updateSomeThing(String id){ * return "hello" + id; * } * } *

- * + *

*

      * @Resource(name = "")
      * @SncpDyn(remote = false)
      * @ResourceType({TestService.class})
      * public final class _DynLocalTestService extends TestService{
-     *
+     * 

* @Resource * private BsonConvert _convert; - * + *

* private Transport _sameGroupTransport; - * + *

* private Transport[] _diffGroupTransports; - * + *

* private SncpClient _client; - * + *

* private String _selfstring; - * + *

* @Override * public String toString() { * return _selfstring == null ? super.toString() : _selfstring; * } - * + *

* @Override * public void createSomeThing(TestBean bean){ * this._createSomeThing(false, true, true, bean); * } - * + *

* @SncpDyn(remote = false, index = 0) * public void _createSomeThing(boolean selfrunnable, boolean samerunnable, boolean diffrunnable, TestBean bean){ * if(selfrunnable) super.createSomeThing(bean); @@ -147,12 +147,12 @@ public abstract class Sncp { * if (samerunnable) _client.remoteSameGroup(_convert, _sameGroupTransport, 0, true, false, false, bean); * if (diffrunnable) _client.remoteDiffGroup(_convert, _diffGroupTransports, 0, true, true, false, bean); * } - * + *

* @Override * public String updateSomeThing(String id){ * return this._updateSomeThing(true, true, true, id); * } - * + *

* @SncpDyn(remote = false, index = 1) * public String _updateSomeThing(boolean selfrunnable, boolean samerunnable, boolean diffrunnable, String id){ * String rs = super.updateSomeThing(id); @@ -163,7 +163,7 @@ public abstract class Sncp { * } * } *

- * + *

* 创建Service的本地模式Class * * @param Service子类 @@ -216,6 +216,12 @@ public abstract class Sncp { av0.visit("remote", Boolean.FALSE); av0.visitEnd(); } + { //给新类加上 原有的Annotation + for (Annotation ann : serviceClass.getAnnotations()) { + if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) continue; + visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann); + } + } { av0 = cw.visitAnnotation(Type.getDescriptor(ResourceType.class), true); { @@ -675,7 +681,7 @@ public abstract class Sncp { */ @SuppressWarnings("unchecked") public static T createLocalService(final String name, final Consumer executor, final ResourceFactory resourceFactory, - final Class serviceClass, final InetSocketAddress clientAddress, final Transport sameGroupTransport, final Collection diffGroupTransports) { + final Class serviceClass, final InetSocketAddress clientAddress, final Transport sameGroupTransport, final Collection diffGroupTransports) { try { final Class newClazz = createLocalServiceClass(name, serviceClass); T rs = (T) newClazz.newInstance(); @@ -782,48 +788,48 @@ public abstract class Sncp { * @SncpDyn(remote = true) * @ResourceType({TestService.class}) * public final class _DynRemoteTestService extends TestService{ - * + *

* @Resource * private BsonConvert _convert; - * + *

* private Transport _transport; - * + *

* private SncpClient _client; - * + *

* private String _selfstring; - * + *

* @Override * public String toString() { * return _selfstring == null ? super.toString() : _selfstring; * } - * + *

* @SncpDyn(remote = false, index = 0) * public void _createSomeThing(boolean selfrunnable, boolean samerunnable, boolean diffrunnable, TestBean bean){ * _client.remote(_convert, _transport, 0, selfrunnable, samerunnable, diffrunnable, bean); * } - * + *

* @SncpDyn(remote = false, index = 1) * public String _updateSomeThing(boolean selfrunnable, boolean samerunnable, boolean diffrunnable, String id){ * return _client.remote(_convert, _transport, 1, selfrunnable, samerunnable, diffrunnable, id); * } - * + *

* @Override * public void createSomeThing(TestBean bean){ * _client.remote(_convert, _transport, 2, bean); * } - * + *

* @Override * public String findSomeThing(){ * return _client.remote(_convert, _transport, 3); * } - * + *

* @Override * public String updateSomeThing(String id){ * return _client.remote(_convert, _transport, 4, id); * } * } * - * + *

* 创建远程模式的Service实例 * * @param Service泛型 @@ -837,7 +843,7 @@ public abstract class Sncp { */ @SuppressWarnings("unchecked") public static T createRemoteService(final String name, final Consumer executor, final Class serviceClass, - final InetSocketAddress clientAddress, final Transport transport) { + final InetSocketAddress clientAddress, final Transport transport) { if (serviceClass == null) return null; if (!Service.class.isAssignableFrom(serviceClass)) return null; int mod = serviceClass.getModifiers(); @@ -910,6 +916,12 @@ public abstract class Sncp { av0.visit("remote", Boolean.TRUE); av0.visitEnd(); } + { //给新类加上 原有的Annotation + for (Annotation ann : serviceClass.getAnnotations()) { + if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) continue; + visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann); + } + } { fv = cw.visitField(ACC_PRIVATE, "_convert", convertDesc, null, null); av0 = fv.visitAnnotation("Ljavax/annotation/Resource;", true);