`
knight_black_bob
  • 浏览: 855072 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于cglib 反射 netty http1.0

阅读更多



数据源 代码位置:http://knight-black-bob.iteye.com/blog/2256698 

netty  代码位置:http://knight-black-bob.iteye.com/blog/2256690

 

 

package com.netty.dto;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class ResponceInfo {

	private Integer code; 
	private String message; 
	private Object data; 
	 
	
	public ResponceInfo() { 
	}
	
	public ResponceInfo(Integer code, String message, Object data) { 
		this.code = code;
		this.message = message;
		this.data = data;
	}
	
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	
	@Override
	public String toString() {
		Gson gson=new GsonBuilder()
			    .disableHtmlEscaping()
			    .serializeNulls()
			    .create();;
		return gson.toJson(this);
	}
}

 

 

package com.netty.business;

import org.springframework.cglib.reflect.FastClass;
import org.springframework.cglib.reflect.FastMethod; 

import com.netty.dto.ResponceInfo;

public class CGLibCode {
	
	public static  ResponceInfo execute(Object targetObject,String methodName,Class<?>[] parameterTypes, Object[] parameters){
		try {
			FastClass serviceFastClass = FastClass.create(targetObject.getClass());
			FastMethod serviceFastMethod = serviceFastClass.getMethod(methodName, parameterTypes);
			return (ResponceInfo)serviceFastMethod.invoke(targetObject, parameters);
		} catch (Exception e) {
			return null ;
		}
	}

}

 

 

package com.netty.business;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;
import org.springframework.util.StringUtils;

import com.common.util.ParamsUtils;
import com.google.common.base.Strings;  
import com.netty.service.NettyServicePool;

import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.QueryStringDecoder;
import io.netty.handler.codec.http.multipart.Attribute;
import io.netty.handler.codec.http.multipart.DefaultHttpDataFactory;
import io.netty.handler.codec.http.multipart.HttpPostRequestDecoder;
import io.netty.handler.codec.http.multipart.InterfaceHttpData;
import io.netty.handler.codec.http.multipart.InterfaceHttpData.HttpDataType;

public class BusinessHandler {

	private static Logger logger = Logger.getLogger(BusinessHandler.class);
	private static HttpRequest req;

	public BusinessHandler(){
		req = null;
	}
	
	public static HttpRequest getReq() {
		return req;
	}

	public static void setReq(HttpRequest req) {
		BusinessHandler.req = req;
	}

	public BusinessHandler(HttpRequest req) { 
		BusinessHandler.req = req;
	}

	public    String handler(){
		Map<String, List<String>> _params=null;
		String srcUrl = req.getUri();
		try {
			if(req.getMethod()==HttpMethod.GET)
				_params=_getParams(srcUrl);
			else
				_params=_postParams(srcUrl);
		} catch (Exception e) {}
		return _execute(_params);
	}
	
	private static String _execute(Map<String, List<String>> params) {
		String cln=ParamsUtils.getStringFromMap(params, "cln");//接口名
		String mod=ParamsUtils.getStringFromMap(params, "mod");//方法名
		if(StringUtils.hasText(cln) && StringUtils.hasText(mod)){
			Object  autoService= NettyServicePool.NETTYSERVICES.get(cln);
			if(null!=autoService){
				params.remove("cln");
				params.remove("mod");
				String[] ps=new String[params.size()];
				Class<?>[] cs=new Class<?>[params.size()];
				int i=0;
				for (Entry<String, List<String>> e : params.entrySet()) {
					cs[i]=String.class;
					String _value=null ;
					if(null!=e.getValue() && e.getValue().size()>0)
						_value=e.getValue().get(0);
					ps[i]=_value;
					i++; 
				}
				return  CGLibCode.execute(autoService, mod, cs, ps).toString();
			}
		}  
		return null;
	}

	private static Map<String, List<String>> _postParams(String srcUrl) throws IOException {
		HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false), req);
		Map<String, List<String>> params=new HashMap<String, List<String>>();
		if (decoder != null) {
			List<InterfaceHttpData> postDatas = decoder.getBodyHttpDatas(); 
			for (InterfaceHttpData postData:postDatas) {
				if (postData.getHttpDataType() == HttpDataType.Attribute){
					Attribute attribute = (Attribute) postData;
					String v=attribute.getValue();
					List<String> list=new ArrayList<String>();
					list.add(Strings.nullToEmpty(v));
					params.put(attribute.getName(), list);
				}
			}
		}
		return params;
	}

	
	//未加密
	private static Map<String, List<String>> _getParams(String srcUrl) {
		QueryStringDecoder decoder = new QueryStringDecoder(srcUrl);
		Map<String, List<String>> params=new HashMap<String, List<String>>();
		params = decoder.parameters();
		return params;
	}
}

 

 

package com.netty.core;
 
import org.apache.log4j.Logger;
  
import com.netty.business.BusinessHandler;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.handler.codec.http.HttpHeaders.Names; 

public class NettyServerHandler extends ChannelInboundHandlerAdapter {
	
	Logger logger = Logger.getLogger(NettyServerHandler.class);
	 
	
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg)
			throws Exception { 
		logger.info("channelRead " + msg);
		if (msg instanceof HttpRequest){
			HttpRequest req = (HttpRequest) msg;
			logger.info(req.getUri());
			if(HttpHeaders.is100ContinueExpected(req)){
				ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE));
			}
			String _result=new BusinessHandler(req).handler();
			logger.info("_result : " + _result);
			FullHttpResponse  response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(_result.getBytes()));
			response.headers().set(Names.CONTENT_TYPE, "text/html; charset=utf-8");
			response.headers().set(Names.CONTENT_LENGTH, response.content().readableBytes());
			ctx.write(response).addListener(ChannelFutureListener.CLOSE);
		} 
	}  
	
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		logger.info("exceptionCaught ");
		ctx.close();
	}
	

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) {
		logger.info("channelReadComplete ");
		ctx.flush();
	}
	
}

 

 

package test.netty;

import java.net.URI;

import org.junit.Test; 

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpRequestEncoder;
import io.netty.handler.codec.http.HttpResponseDecoder;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.HttpContent; 
import io.netty.handler.codec.http.HttpResponse;
 
public class NettyClient2Test {

	public void connect(String host, int port) throws Exception {
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            Bootstrap b = new Bootstrap();
            b.group(workerGroup);
            b.channel(NioSocketChannel.class);
            b.option(ChannelOption.SO_KEEPALIVE, true);
            b.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    // 客户端接收到的是httpResponse响应,所以要使用HttpResponseDecoder进行解码
                    ch.pipeline().addLast(new HttpResponseDecoder());
                    // 客户端发送的是httprequest,所以要使用HttpRequestEncoder进行编码
                    ch.pipeline().addLast(new HttpRequestEncoder());
                    ch.pipeline().addLast(new HttpClientInboundHandler2());
                }
            });

            // Start the client.
            ChannelFuture f = b.connect(host, port).sync();

            URI uri = new URI("http://127.0.0.1:8443?cln=mifiDeviceService&mod=getMifiDeviceById&id="+6);
            String msg = "cln=mifiDeviceService&mod=getMifiDeviceById&id=6";
            DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
                    uri.toASCIIString(), Unpooled.wrappedBuffer(msg.getBytes("UTF-8")));

            // 构建http请求
            request.headers().set(HttpHeaders.Names.HOST, host);
            request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
            request.headers().set(HttpHeaders.Names.CONTENT_LENGTH, request.content().readableBytes());
            // 发送http请求
            f.channel().write(request);
            f.channel().flush();
           // f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
        }

    }
 
	@Test
	public void Test(){
		try{ 
			NettyClient2Test client = new NettyClient2Test();
	        client.connect("127.0.0.1", 8443);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

class HttpClientInboundHandler2 extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof HttpResponse) 
        {
            HttpResponse response = (HttpResponse) msg;
            System.out.println("CONTENT_TYPE:" + response.headers().get(HttpHeaders.Names.CONTENT_TYPE));
        }
        if(msg instanceof HttpContent)
        {
            HttpContent content = (HttpContent)msg;
            ByteBuf buf = content.content();
            System.out.println(buf.toString(io.netty.util.CharsetUtil.UTF_8));
            buf.release();
        }
    }
}

 

package com.mifi.serviceimpl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.common.util.netty.StatusCode;
import com.mifi.bean.MifiDevice;
import com.mifi.dao.MifiDeviceDao;
import com.mifi.service.MifiDeviceService;
import com.netty.dto.ResponceInfo;
import com.netty.service.NettyServerService;

@NettyServerService(name="mifiDeviceService")
@Service
public class MifiDeviceServiceImpl implements MifiDeviceService {

	@Autowired
	MifiDeviceDao dao;
	
	// 1 true 0, false
 	public  ResponceInfo  hasMifiDeviceById(String id){
		//return dao.getMifiDeviceById(id) == null ? false : true ;
 		int  result=0;
 		if(dao.getMifiDeviceById(Long.parseLong(id)) != null)
 		 result=1;
		return new  ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result);
	}
	
	public  ResponceInfo getMifiDeviceById(String id){
		MifiDevice   mifiDevice = null;
		try{
              mifiDevice = dao.getMifiDeviceById(Long.parseLong(id));
		}catch(Exception e){
			
		}
		return new  ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,mifiDevice);
		
	}
	
	 public ResponceInfo  findAllMifiDevices(){
		 List<MifiDevice> mlist =  null ;
		 try{
			 mlist= dao.findAllMifiDevices();
		}catch(Exception e){
			
		}
		 return new  ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,mlist);
			
	 } 
	 
	 public ResponceInfo addMifiDevice(MifiDevice mifiDevice){
		 int  result=0;
		 try{
		 		 result=1;
			 dao.addMifiDevice(mifiDevice);
		}catch(Exception e){
			
		}
		 return new  ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result);
	 }
	 
	 public ResponceInfo delMifiDeviceById(String id){
		 int  result=0;
		 try{
		 		 result=1;
		 		 dao.delMifiDeviceById(Long.parseLong(id));
		}catch(Exception e){
			
		}
		 return new  ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result);
		
	 }
	 
	 public ResponceInfo updateMifiDevice(MifiDevice mifiDevice){
		 int  result=0;
		 try{
		 		 result=1;
		 		 dao.updateMifiDevice(mifiDevice);
		}catch(Exception e){
			
		}
		 return new  ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result);
	 }
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

  • 大小: 20.1 KB
0
2
分享到:
评论

相关推荐

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...

    java cglib和反射demo

    Java中的CGLib与反射是两种常用的动态代理技术,它们在实现面向切面编程(AOP)时发挥着重要作用。本文将深入探讨这两种技术,并通过一个简单的AOP demo来阐述它们的使用方法。 首先,让我们了解什么是CGLib。CGLib...

    cglib.jar下载

    它比使用java反射的JDK动态代理要快。 CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。 CGLIB缺点:对于...

    CGLIB需要的asm-2.2.3.jar和cglib-nodep-2.2.jar

    3. **性能优化**:由于CGLIB是基于字节码操作,所以它的运行效率通常比使用反射更高。特别是在大规模对象创建或者频繁方法调用的场景下,使用CGLIB能显著提高性能。 4. **类的扩展**:CGLIB允许在运行时动态地生成...

    cglib_cglib3.2_remain3gr_cglibjar包_cglib.jar_

    相比Java自带的InvocationHandler接口,CGLib的性能更优,因为它避免了反射的开销,而是直接通过字节码技术来生成和执行代理对象。 【版本选择】 描述中提到“版本太高不知道会不会有影响”,这确实是一个需要考虑...

    CGLIB依赖jar包

    CGLIB是基于ASM(一个底层的Java字节码操作和分析框架)来实现的,它允许开发者在运行时为Java类创建子类,而无需访问其源代码或重新编译。这种技术在许多场景下都非常有用,比如实现AOP(面向切面编程)中的动态...

    基于MAVEN项目的CGLib动态代理原理及实现

    本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...

    cglib_cglib.zip

    由于CGLib是基于字节码操作的,因此对于Java虚拟机(JVM)的运行机制有一定的要求。在某些场景下,如处理final方法或静态方法时,CGLib可能无法实现预期的效果。此外,使用CGLib可能会带来一定的性能开销,因为每次...

    cglib及其依赖包

    CGLib的工作原理是基于ASM库,ASM是一个字节码操作和分析框架,它可以用来动态生成类或增强已存在的Java类的功能。ASM提供了一种直接操作字节码的方法,这使得CGLib能够创建目标类的子类,并在子类中拦截并扩展父类...

    动态代理cglibjar包和源码

    - JDK Proxy基于接口实现,而CGLIB基于继承,因此CGLIB可以代理没有接口的类。 - JDK Proxy性能相对较慢,因为涉及到反射,而CGLIB通过字节码生成,性能更好。 - JDK Proxy易于理解和使用,CGLIB则需要更深入的...

    cglib的依赖包

    CGlib,全称为Code Generation Library,是一个强大的Java代码生成库,广泛用于动态代理、AOP(面向切面编程)框架以及性能优化等场景。它通过字节码技术为类创建子类,从而实现对目标类的功能增强。在Java中,由于...

    Cglib3.3.0最新版jar包

    Cglib基于ASM库,能够在字节码层面操作Java类,通过生成子类来实现对目标类的扩展,而无需修改源代码。这种方法尤其适用于那些不支持接口或无法修改源代码的类。 2. **动态代理**:动态代理是Java中一个重要的概念...

    cglib2.2.jar

    3. **字节码生成**:CGLIB通过ASM库生成新的字节码,然后使用Java的反射API来加载这个新生成的类到JVM中。 在实际开发中,选择使用`cglib2.2.jar`还是`cglib-nodep-2.2.jar`取决于项目的具体情况。如果项目已经包含...

    cglib使用的jar包

    测试基于cglib动态代理测试使用的jar包. asm-7.0-beta.jar asm-commons-7.0-beta.jar asm-util-7.0-beta.jar cglib-3.1.jar

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    Java中的动态代理、反射和...总之,理解和掌握JDK动态代理、CGLIB动态代理、反射和拦截器是提升Java开发技能的关键步骤。通过实际操作这些示例,你将能够更好地应用这些技术到实际项目中,提高代码的灵活性和可维护性。

    Cglib所需要的jar包

    这种方式比基于Java反射API的动态代理更高效,因为反射需要在运行时查找方法,而Cglib直接通过字节码操作实现。 在实际开发中,Cglib常用于AOP(面向切面编程)框架,例如Spring AOP。通过Cglib,Spring可以在不...

    cglib2.2jar包

    2. **性能优化**:在某些情况下,CGLIB生成的代理类比使用Java反射机制性能更好,因为它是在运行时通过字节码技术生成的子类,避免了反射带来的性能损耗。 3. **代码生成**:CGLIB也可以用于自动生成类和方法,简化...

    cglib.jar以及cglib-src.jar

    这种方法比使用Java反射性能更高,因为反射在运行时解析类和方法会带来一定的开销。 在"cglib-src-2.2.jar"中,包含了CGLIB的源代码,开发者可以深入研究其内部实现,这对于理解其工作原理和进行定制化开发非常有...

    cglib-3.1-API文档-中文版.zip

    赠送jar包:cglib-3.1.jar; 赠送原API文档:cglib-3.1-javadoc.jar; 赠送源代码:cglib-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-3.1.pom; 包含翻译后的API文档:cglib-3.1-javadoc-API文档-中文(简体)版...

Global site tag (gtag.js) - Google Analytics