精华内容
下载资源
问答
  • java动态生成类

    千次阅读 2017-07-29 15:45:37
    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件。 那么技术实现支持:使用cglib代理。 具体的实现步骤: 1.cglib的jar包(cglib-nodep):我用的是...
    

    转载.....

    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件。

    那么技术实现支持:使用cglib代理。

    具体的实现步骤:

    1.cglib的jar包(cglib-nodep):我用的是cglib-nodep-2.2.jar

    2.封装的cglib类:

    package com.citics.test.model;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;

    import net.sf.cglib.beans.BeanGenerator;
    import net.sf.cglib.beans.BeanMap;

    public class DynamicBean {

     private  Object object = null;//动态生成的类
     private  BeanMap beanMap = null;//存放属性名称以及属性的类型

     public DynamicBean() {
      super();
     }
     
     @SuppressWarnings("rawtypes")
     public DynamicBean(Map propertyMap) {
      this.object = generateBean(propertyMap);
      this.beanMap = BeanMap.create(this.object);
     }

     /**
      * 给bean属性赋值
      * @param property 属性名
      * @param value 值
      */
     public void setValue(Object property, Object value) {
      beanMap.put(property, value);
     }

     /**
      * 通过属性名得到属性值
      * @param property 属性名
      * @return 值
      */
     public Object getValue(String property) {
      return beanMap.get(property);
     }

     /**
      * 得到该实体bean对象
      * @return
      */
     public Object getObject() {
      return this.object;
     }

     /**
      * @param propertyMap
      * @return
      */
     @SuppressWarnings("rawtypes")
     private Object generateBean(Map propertyMap) {
      BeanGenerator generator = new BeanGenerator();
      Set keySet = propertyMap.keySet();
      for (Iterator i = keySet.iterator(); i.hasNext();) {
        String key = (String) i.next();
        generator.addProperty(key, (Class) propertyMap.get(key));
      }
      return generator.create();
     }
     
    }

    3.需求的实现类:

    package com.citics.platformx.test.controller;


    import java.beans.BeanInfo;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Properties;
    import java.util.Set;

    import com.citics.test.model.DynamicBean;
    import com.citics.test.model.LeapRole;


    public class ClassUtil {
     private  String filepath="/config/";//配置文件路径
     public String getFilepath() {
      return filepath;
     }
     public void setFilepath(String filepath) {
      this.filepath = filepath;
     }
     @SuppressWarnings({ "rawtypes","unchecked"})
     public Object dynamicClass(Object object) throws Exception{
      HashMap returnMap = new HashMap();
      HashMap typeMap=new HashMap();
      //读取配置文件
      Properties prop=new Properties();
      String sourcepackage=object.getClass().getName();
      String classname=sourcepackage.substring(sourcepackage.lastIndexOf(".")+1);
      InputStream in=ClassUtil.class.getResourceAsStream(filepath+classname+".properties");
      prop.load(in);
     
      Set<String> keylist=prop.stringPropertyNames();
     
      Class type=object.getClass();
      BeanInfo beanInfo = Introspector.getBeanInfo(type);
      PropertyDescriptor[] propertyDescriptors=beanInfo.getPropertyDescriptors();
      for(int i=0;i<propertyDescriptors.length;i++){
       PropertyDescriptor descriptor=propertyDescriptors[i];
       String propertyName = descriptor.getName();
       if(!propertyName.equals("class")){
        Method readMethod=descriptor.getReadMethod();
        Object result = readMethod.invoke(object, new Object[0]);
        if (result != null) {
         returnMap.put(propertyName, result);
        } else {
         returnMap.put(propertyName, "");
        }
        typeMap.put(propertyName,  descriptor.getPropertyType());
       }
      }
      //加载配置文件中的属性
      Iterator<String> iterator=keylist.iterator();
      while(iterator.hasNext()){
       String key=iterator.next();
          returnMap.put(key, prop.getProperty(key));
          typeMap.put(key, Class.forName("java.lang.String"));
      }
      //map转换成实体对象
      DynamicBean bean = new DynamicBean(typeMap);
      //赋值
      Set keys=typeMap.keySet();
      for(Iterator it=keys.iterator();it.hasNext();){
       String key = (String) it.next();
       bean.setValue(key, returnMap.get(key));
      }
      Object obj=bean.getObject();
      return obj;
     }
     public static void main(String[] args) throws Exception{
      new ClassUtil().dynamicClass(new LeapRole());
     }
    }

    4.技术实现目的:前台框架表格数据源实际上就是带有数据的实体,但是grid中数据的类型、已经是否可见、toolbar工具栏上的按钮、是否分页,是针对实体而言,所以目前把这些信息作为实体的配置文件。在展示页面之前,读取全部信息,转为参数对象的完整对象。

    展开全文
  • 主要介绍了Java 动态生成类和实例, 并注入方法操作,结合实例形式分析了Java 动态生成类和实例以及动态注入相关操作技巧,需要的朋友可以参考下
  • Java动态生成类以及动态添加属性

    万次阅读 2017-11-18 16:14:20
    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件。 那么技术实现支持:使用CGLib代理。 具体的实现步骤: 1.配置Maven文件: xmlns:xsi=...

    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件。

    那么技术实现支持:使用CGLib代理。

    具体的实现步骤:

    1.配置Maven文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.journey</groupId>
        <artifactId>journey</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2.2</version>
            </dependency>
        </dependencies>
    
    </project>

    2.封装的cglib类

    package com.journey;
    
    import net.sf.cglib.beans.BeanGenerator;
    import net.sf.cglib.beans.BeanMap;
    
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * Created by little_eleventh_wolf on 2017/11/18.
     */
    public class DynamicBean {
        private Object object = null; //动态生成的类
        private BeanMap beanMap = null; //存放属性名称以及属性的类型
    
        public DynamicBean() {
            super();
        }
    
        public DynamicBean(Map propertyMap) {
            this.object = generateBean(propertyMap);
            this.beanMap = BeanMap.create(this.object);
        }
    
        /**
         * @param propertyMap
         * @return
         */
        private Object generateBean(Map propertyMap) {
            BeanGenerator generator = new BeanGenerator();
            Set keySet = propertyMap.keySet();
            for(Iterator i = keySet.iterator(); i.hasNext(); ) {
                String key = (String) i.next();
                generator.addProperty(key, (Class) propertyMap.get(key));
            }
            return generator.create();
        }
    
        /**
         * 给bean属性赋值
         * @param property 属性名
         * @param value 值
         */
        public void setValue(Object property, Object value) {
            beanMap.put(property, value);
        }
    
        /**
         * 通过属性名得到属性值
         * @param property 属性名
         * @return 值
         */
        public Object getValue(String property) {
            return beanMap.get(property);
        }
    
        /**
         * 得到该实体bean对象
         * @return
         */
        public Object getObject() {
            return this.object;
        }
    }

    3.需求的实现类:

    package com.journey;
    
    import java.beans.BeanInfo;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Properties;
    import java.util.Set;
    
    /**
     * Created by little_eleventh_wolf on 2017/11/18.
     */
    public class ClassUtil {
        private String filePath = "/config/"; //配置文件路径
    
        public String getFilePath() {
            return filePath;
        }
    
        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }
    
        public Object dynamicClass(Object object) throws Exception {
            HashMap returnMap = new HashMap();
            HashMap typeMap = new HashMap();
            //读取配置文件
            Properties prop = new Properties();
            String sourcepackage = object.getClass().getName();
            String classname = sourcepackage.substring(sourcepackage.lastIndexOf(".") + 1);
            InputStream in = ClassUtil.class.getResourceAsStream(filePath + classname + ".properties");
            prop.load(in);
    
            Set<String> keylist = prop.stringPropertyNames();
    
            Class type = object.getClass();
            BeanInfo beanInfo = Introspector.getBeanInfo(type);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for(int i = 0; i < propertyDescriptors.length; i++) {
                PropertyDescriptor descriptor = propertyDescriptors[i];
                String propertyName = descriptor.getName();
                if(!propertyName.equals("class")) {
                    Method readMethod = descriptor.getReadMethod();
                    Object result = readMethod.invoke(object, new Object[0]);
                    if(result != null) {
                        returnMap.put(propertyName, result);
                    } else {
                        returnMap.put(propertyName, "");
                    }
                    typeMap.put(propertyName, descriptor.getPropertyType());
                }
            }
            //加载配置文件中的属性
            Iterator<String> iterator = keylist.iterator();
            while(iterator.hasNext()) {
                String key = iterator.next();
                returnMap.put(key, prop.getProperty(key));
                typeMap.put(key, Class.forName("java.lang.String"));
            }
            //map转换成实体对象
            DynamicBean bean = new DynamicBean(typeMap);
            //赋值
            Set keys = typeMap.keySet();
            for(Iterator it = keys.iterator(); it.hasNext(); ) {
                String key = (String) it.next();
                bean.setValue(key, returnMap.get(key));
            }
            Object obj = bean.getObject();
            return obj;
        }
    
        public static void main(String[] args) throws Exception {
            new ClassUtil().dynamicClass(new LeapRole()/*LeapRole是个普通类,未贴源码*/);
        }
    }

    4.技术实现目的:前台框架表格数据源实际上就是带有数据的实体,但是grid中数据的类型、以及是否可见、toolbar工具栏上的按钮、是否分页,是针对实体而言,所以目前把这些信息作为实体的配置文件。在展示页面之前,读取全部信息,转为参数对象的完整对象。


    展开全文
  • 如何获取Java动态生成类

    千次阅读 2018-03-09 18:51:11
    写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类,有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子,通过这篇文章,我们就能够很...

    写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类,

    有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子,

    通过这篇文章,我们就能够很容易到达目的。

     

    工具:利用JDK自带的工具。

      相关命令:java -cp .;%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.HSDB

     

    操作步骤:

    1) 打开命令行窗口, 查看JDK安装目录

       

    2) 进入该目录

      

    3)输入关键命令

      

      将会弹出一个Swing程序,如下图

      

     

     4) File->Attach to HotSpot Process, 并输入想查看Java进程的ProcessId

      

     

      

     

      

     

       

     

    5)经过如上步骤,将会在当前目录下生成相应的Class文件,最后找一个反编译工具(如jd-gui)打开,即可以看到原码啦。

     

      

     

    展开全文
  • 有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子, 通过这篇文章,我们就能够很容易到达目的。 工具:利用JDK自带的工具。  相关命令:java -cp .;%JAVA_HOME%/lib/sa-jdi...

     

     

    写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类,

    有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子,

    通过这篇文章,我们就能够很容易到达目的。

     

    工具:利用JDK自带的工具。

      相关命令:java -cp .;%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.HSDB

     

    操作步骤:

    1) 打开命令行窗口, 查看JDK安装目录

       

    2) 进入该目录

      

    3)输入关键命令

      

      将会弹出一个Swing程序,如下图

      

     

     4) File->Attach to HotSpot Process, 并输入想查看Java进程的ProcessId

      

     

      

     

      

     

       

     

    5)经过如上步骤,将会在当前目录下生成相应的Class文件,最后找一个反编译工具(如jd-gui)打开,即可以看到原码啦。

     

      

     

    转载于:https://www.cnblogs.com/nickt/p/8535445.html

    展开全文
  • java动态生成类的原理

    2013-02-06 11:32:15
    java可以动态生成一个类,就像Proxy类里所做的那样,看了源码之后发现看不懂,请大牛出来解释一下动态生成类的思路和原理
  • Java 动态生成类和实例, 并注入方法

    万次阅读 2016-12-29 16:29:01
    Java官方支持的, 必须要有接口才行 import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java....
  • 在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在...cglib这个开源库即可解决我们的问题,动态创建JAVA对象。 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性
  • 具体下载目录在 /2014年资料/11月/3日/Java动态生成类以及动态添加属性/ 下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm ------------------------------------------分割线-------------...
  • JAVA 动态生成实体.rar

    热门讨论 2009-12-13 20:01:21
    JAVA 动态生成实体.rar mvc做的,指需要输入数据库名 密码 数据库的名字即可
  • cglib动态生成java类

    2014-01-26 15:17:53
    cglib动态生成java类
  • java动态生成枚举

    2015-05-17 22:18:50
    求大神指点我要生成如下枚举,如何改造上边代码 private static enum TestEnum { TEST1("A001", "测试1"), TEST2("A002", "测试2"); private String code; private String name; private ...
  • 主要介绍了Java运行时动态生成类实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 为什么有这个东西,一方面时AOP框架的需要,另一方面是增加软件逆向的难度动态生成类的技术目前大体上分为两类,一类是通过操作字节码框架如cglib/Javassist去实现,另一类就是JNI方式,调用dll/so库,内存中动态...
  • 如何动态生成一个Java类

    千次阅读 2020-06-23 22:57:27
    如何动态生成一个Java类 开发者编写Java 代码,调用 javac 编译生成 class 文件。然后通过加载机制载入 JVM ,即成为了应用可以使用的 Java 。 可以写一个编译编译 java 代码: import java.io.File; import ...
  • 使用CGLib代理,实现Java动态生成类以及动态注入属性 工程目录 代码实现 代码测试 项目地址: https://gitee.com/mayun-john/DynamicCreateBean.git
  • Java获取动态生成的代理

    千次阅读 2019-02-26 17:15:26
    Java获取动态生成的代理 以下以获取mybatis动态代理为例子 获取java进程的id 使用cmd命令,获取java运行id,可见端口号为11944 netstat -aon|findstr "端口号" 查看JVM运行数据 使用cmd命令,开启...
  • package com.java.test.dynamicpojo;...import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URI; import...
  • java通过cglib动态生成实体bean

    万次阅读 2021-01-08 15:50:49
    DynamicBeanEntity.class动态bean: package com.dym.entity; import net.sf.cglib.beans.BeanGenerator; import org.apache.commons.collections.map.MultiValueMap; import java.lang.reflect.*; import java....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,439
精华内容 2,975
关键字:

java动态生成类

java 订阅