`

反射通用类

    博客分类:
  • java
阅读更多


import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/***
 * @java反射通用类
 */
public class Reflection {
 /**    
     * 得到某个对象的公共属性public    
     * @param owner, fieldName    
     * @return 该属性对象    
     * @throws Exception    
     */     
    public Object getProperty(Object owner, String fieldName) throws Exception {      
        Class<?> ownerClass = owner.getClass();      
        Field field = ownerClass.getField(fieldName);      
        Object property = field.get(owner);      
        return property;      
    } 
   
    /***
     *
     * @param owner
     * @param fieldName
     * @param value
     * @throws Exception
     */
    public void setProperty(Object owner,String fieldName,Object value){
        try {
            Class<?> ownerClass = owner.getClass();      
            Field field = ownerClass.getField(fieldName);    
   field.set(owner, value);
  } catch (Exception e) {
   
  }  
    }
     
    /**    
     * 得到某类的静态公共属性    
     * @param className   类名    
     * @param fieldName   属性名    
     * @return 该属性对象    
     * @throws Exception    
     */     
    public Object getStaticProperty(String className, String fieldName)      
            throws Exception {      
     Class<?>  ownerClass = Class.forName(className);      
        Field field = ownerClass.getField(fieldName);      
        Object property = field.get(ownerClass);      
        return property;      
    }      
    
    /**    
     * 执行某对象方法 参数 
     * @param owner 对象  
     * @param methodName  方法名  
     * @param args  参数 参数不能为空 
     * @return 方法返回值    
     * @throws Exception    
     */     
    public Object invokeMethod(Object owner, String methodName, Object args){ 
     Class<?>  ownerClass = owner.getClass();
        Method method = null;
        Object o = null;
  try {
   method = ownerClass.getMethod(methodName, args.getClass());
  } catch (Exception e1) {
   e1.printStackTrace();
  } 
  try {
   o = method.invoke(owner,args);
  } catch (Exception e) {
   e.printStackTrace();
  }
        return o;      
    }
     
    /**    
     * 执行某对象方法 执行方法时候,有参数就传数组 没有时候就传null 
     * @param owner 对象  
     * @param methodName  方法名  
     * @param args  参数  
     * @return 方法返回值    
     * @throws Exception    
     */     
    public Object invokeMethods(Object owner, String methodName, Object[] args)      
            throws Exception {      
     Class<?>  ownerClass = owner.getClass();
     Class<?>[] argsClass = null;
     int len = args.length;
     if(args!=null){
      argsClass = new Class[len]; 
            for(int i = 0, j = len; i < j; i++) {      
                argsClass[i] = args[i].getClass();      
            }
     }
        Method method = null;
  try {
   method = ownerClass.getMethod(methodName, argsClass);
  } catch (RuntimeException e1) {
   e1.printStackTrace();
  } 
        Object o = null;
  try {
   o = method.invoke(owner, args);
  } catch (Exception e) {
  }
        return o;      
    }      
     
    /**    
     * 执行某类的静态方法    
     * @param className  类名    
     * @param methodName  方法名  
     * @param args  参数数组  
     * @return 执行方法返回的结果    
     * @throws Exception    
     */     
    public Object invokeStaticMethod(String className, String methodName,      
            Object[] args) throws Exception {      
        Class<?>  ownerClass = Class.forName(className);      
        Class<?>[] argsClass = null;
        int len = args.length;
        if(args!=null){
         argsClass = new Class[len];
            for (int i = 0, j = len; i < j; i++) {      
                argsClass[i] = args[i].getClass();      
            }
        }
        Method method = ownerClass.getMethod(methodName, argsClass);      
        return method.invoke(null, args);      
    }      
     
    /**    
     * 新建实例    
     * @param className  类名  
     * @param args   多个构造函数的参数  
     * @return 新建的实例    
     * @throws Exception    
     */     
    public Object newInstance(String className, Object[] args) throws Exception {      
        Class<?>  newoneClass = Class.forName(className);      
        Class<?>[] argsClass = new Class[args.length];      
        for (int i = 0, j = args.length; i < j; i++) {      
            argsClass[i] = args[i].getClass();      
        }      
        Constructor<?>  cons = newoneClass.getConstructor(argsClass);      
        return cons.newInstance(args);      
     
    } 
   
    /**    
     * 新建实例    
     * @param className  类名  
     * @param args   一个构造函数的参数  
     * @return 新建的实例    
     * @throws Exception    
     */     
    public Object newInstance(String className) {
     Object obj = null;
        try {
   Class<?>  newoneClass = Class.forName(className);      
   Constructor<?>  cons  = newoneClass.getConstructor();
   obj = cons.newInstance();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return obj;
     
    }
   
    /***
     * 新建一个数组对象
     * @param cla 要生成数组的Class对象
     * @param length 数组的大小
     * @return
     */
    public Object[] newArray(Class<?> cla ,int length){
     return (Object[])Array.newInstance(cla, length);
    }
          
    /**    
     * 是不是某个类的实例    
     * @param obj 实例    
     * @param cls 类    
     * @return 如果 obj 是此类的实例,则返回 true    
     */     
    public boolean isInstance(Object obj, Class<?>  cls) {      
        return cls.isInstance(obj);      
    }      
          
    /**    
     * 得到数组中的某个元素    
     * @param array 数组    
     * @param index 索引    
     * @return 返回指定数组对象中索引组件的值    
     */     
    public Object getByArray(Object array, int index) {     
        return Array.get(array,index);      
    }
}  

 

分享到:
评论

相关推荐

    java 基于泛型与反射的通用 DAO

    通过这种方式,我们可以创建一个通用的DAO类,不指定具体的实体类,但在子类中指定时,编译器会进行类型检查,避免了类型转换的麻烦。 接着,我们讨论“反射”。反射是Java提供的一个强大的工具,允许程序在运行时...

    采用反射技术和XML的通用实体类

    本文将深入探讨如何结合反射技术和XML来实现通用实体类,并解释这两个技术在这一过程中的作用。 首先,让我们了解什么是反射技术。在Java中,反射是一种强大的工具,它允许程序在运行时检查和操作其他类、接口、...

    通过反射机制写的通用的方法

    在Java编程语言中,反射机制是一项强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个“通过反射机制写的通用的方法”是为了解决数据库查询和对象映射的问题,实现更加灵活和动态的数据访问...

    C#+实体类反射+初阶

    例如,我们可以使用`typeof(Student)`来获取`Student`类的`Type`对象,然后遍历其所有属性,从而实现增删改查的通用代码。这样做的好处是减少了重复代码,提高了代码的可维护性和灵活性。 数据操作通常涉及到CRUD...

    java的类反射

    3. 实现通用方法:例如,集合框架中的`Arrays.toString()`方法就是通过反射来打印数组内容。 4. 动态代理:Java的`java.lang.reflect.Proxy`类可以创建动态代理,用于在方法调用前后添加自定义逻辑,比如AOP(面向切...

    反射类使用.rar

    在Java编程语言中,反射是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个“反射类使用.rar”压缩包很可能是包含...学习并熟练掌握反射,将有助于提升Java编程的灵活性和代码的通用性。

    数据库查询通用类

    数据库查询通用类是一种在软件开发中常见的设计模式,它封装了对数据库的增删改查操作,使得在项目中调用这些操作时更加简洁、高效。这个类通常包含静态方法或者实例方法,允许开发者通过传入不同的参数来执行不同的...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    反射(Reflection)是Java的一个强大特性,允许程序在运行时检查类、接口、字段和方法等信息。本教程将深入探讨如何通过反射获取类、方法上的注解以及注解中的值和方法参数。 1. **注解的定义与使用** 注解以`@`...

    通过反射获得实体类的字段和值

    - 代码复用:通过反射,可以编写通用的代码来处理不同类型的对象,减少了重复代码。 **局限性:** - 性能开销:反射涉及类型信息的查找和解析,比直接调用成员方法或访问字段慢得多。 - 安全性和性能问题:过度使用...

    反射,动态加载指定类调用类中的方法

    1. `Class&lt;?&gt;`: 这是所有Java类的通用表示,通过`Class.forName()`方法可以动态加载指定的类。例如: ```java Class&lt;?&gt; clazz = Class.forName("com.example.YourClassName"); ``` 2. `Constructor&lt;?&gt;`: 代表类...

    反射机制和类加载机制学习总结

    1. **灵活性增强**:通过反射,可以编写更加灵活和通用的代码,因为可以在运行时动态地处理各种不同的类和对象。 2. **代码重用性提高**:反射使得开发者能够通过编写较少的代码来实现更多的功能,尤其是在处理大量...

    利用反射实现类的动态加载

    ### 利用反射实现类的动态加载 #### 反射技术简介 反射是Java语言提供的一种强大特性,允许运行时动态地获取类的信息并操纵类的对象。这种能力使得开发人员能够在编写程序时不确定具体类的情况下,依然能实现对类...

    C#通用Excel导入导出工具类

    本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...

    通过Java annotation以及反射机制实现不同类型通用的数据库访问接口

    在上述代码中,`DatabaseAccess`类通过反射获取`User`类上的`@DatabaseEntity`注解信息,然后根据这些信息构建并执行SQL查询。这种方式使得我们的数据库访问层可以无需修改就能适应不同的实体类,从而提高了代码的可...

    Java反射泛型,实现数据库的动态增删改查等功能

    首先,Java反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和修改字段值。在数据库操作中,反射可以帮助我们根据字符串形式的SQL语句来动态执行相应的方法,无需预先编写大量硬编码...

    基于标注和反射机制的通用JavaBean持久化工具类.pdf

    【标题】和【描述】提到的是一个关于使用标注和反射机制来实现JavaBean持久化的技术文章,主要讨论如何创建一个通用的JavaBean持久化工具类,以提高开发效率,减少SQL语句的编写。 【标签】为空,因此无法提供额外...

    反射机制反射Dao 反射机制

    在Java中,使用反射可以实现通用的DAO,无需为每种数据表创建特定的DAO类。通过传入不同的类名,可以动态创建对应数据表的DAO实例,执行CRUD操作。 7. **安全性与性能**: 反射虽然强大,但也有其缺点。由于绕过了...

    java 反射得到某个方法

    例如,当我们需要对未知类型的对象进行通用操作,或者需要在运行时动态调用方法时,反射就显得非常有用。 然而,尽管反射提供了很大的灵活性,但也要注意其潜在的风险。过度使用反射可能导致代码难以理解和维护,...

    易语言类的反射调用

    易语言类的反射调用源码,类的反射调用,取指针,取当前方法索引,注册方法,set,get,msgbox,test,调用子程序_数组,CopyMemory,取指针_通用型,取指针_通用型_数组,指针到字节,指针到整数,指针到短整数,调用反射函数

Global site tag (gtag.js) - Google Analytics