`

Java.lang.reflect 包下常用的类及方法简介

 
阅读更多

Class类之主要方法简介

 Class<?> cls = String.class; 

一)类自身的信息

1. 包路径    cls.getPackage();

2. 类名      cls.getName();cls.getSimpleName();

3. 类修饰符  cls.getModifiers();

4. 类属性    cls.getFields();cls.getDeclaredFields();

5. 类方法    cls.getMethods();cls.getDeclaredMethods();

6. 类构造器  cls.getConstructors();

7. 标注信息  cls.getAnnotations(); 

8. 是否为基本类型数据 cls.isPrimitive();

9. 获得系统类的 getClassLoader();   这个也较为常用,加载类的时候 

 

获取资源信息

 

获取方法:

1.object.getClass().getDeclaredMethods() : 会方式所有定义的 public, protected, default private访问权限的方法,但是不会取父类的方法或继承之父类的方法

2.object.getClass().getMethods():会取得所有自身类及父类中所有定义的方法

 

从上面我们可以看出,一般在对于方法的操作我更多是采用第一个方法,做一些属性的COPY,或是方法的调用!较少用到第二个方法! 

 

同理 getFields() && getDeclaredFields() 也是一样的原理. 

 

二)获取资源的信息

 

 cls.getResource("http://xx/xx");

 cls.getResourceAsStream("xx.properties");

 

 

判断一个方法的修饰符

  Modifier.isPublic(method.getModifiers());

        Modifier.isAbstract(method.getModifiers());

        Modifier.isInterface(method.getModifiers());

        Modifier.isFinal(method.getModifiers());

        Modifier.isNative(method.getModifiers());

        Modifier.isPrivate(method.getModifiers());

 

 

那么在Class类操作过程中产生的Field  Method  都可以通过这getModifiers()配合Modifier来得到属性或是方法的修饰符

Field :

1.获得修饰符 field.getModifiers();

2.获取基本的类型的值

    field.getBoolean(obj);

    field.getInt(obj);

    field.getDouble(obj);

    ......

3.获得在属性中的标注 这个特性在1.5版本以后添加,CLASS,METHOD,FIELD 都存在 field.getAnnotations();

 

Method :

1.返回类型 method.getReturnType(); 

2.参数类型 method.getParameterTypes(); 

3.名字  method.getName(); 

4.修饰符 method.getModifiers(); 

5.标注 method.getAnnotations(); 

6.反射调用方法 method.invoke(obj, args);也是最为关键的一个方法


根据上面的这些方法,简单造了一个BeanUtils中对象属性COPY的轮子

package com.inter12.test.myclass;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * TODO Comment of MyBeanUtil
 * 
 * @author inter12
 */
public class MyBeanUtil {

    private static final String SET = "set";
    private static final String IS  = "is";
    private static final String GET = "get";

    public Object beanCopy(Object sourceObject, Class<?> targetClass) throws IllegalArgumentException,
                                                                     IllegalAccessException, InvocationTargetException,
                                                                     InstantiationException {

        // 将目标对象的所有SET方法组转成 name-method 的MAP
        Map<String, Method> targetMethodMap = getTargetMethodMap(targetClass);

        Object targetObject = targetClass.newInstance();

        Method[] sourceMethods = sourceObject.getClass().getDeclaredMethods();
        for (Method m : sourceMethods) {

            // 要求时PUBLIC 且无参的方法
            if (Modifier.isPublic(m.getModifiers()) && m.getParameterTypes().length == 0) {

                // 根据源对象中的get方法,匹配目标对象中是否存在对应的SET方法之,若是无返回NULL
                String methodName = getMethodName(m);

                if (targetMethodMap.containsKey(methodName)) {

                    // 源对象的值
                    Object sourceValue = m.invoke(sourceObject, (Object[]) null);

                    // 设置到目标对象
                    Method targetMethod = targetMethodMap.get(methodName);
                    targetMethod.invoke(targetObject, new Object[] { sourceValue });
                }
            }
        }

        return targetObject;
    }

    private String getMethodName(Method m) {
        String methodName = null;
        if (m.getName().startsWith(GET)) {
            methodName = SET + m.getName().substring(3, m.getName().length());

        } else if (m.getName().startsWith(IS)) {
            methodName = SET + m.getName().substring(2, m.getName().length());
        }
        return methodName;
    }

    private Map<String, Method> getTargetMethodMap(Class<?> targetClass) {

        Map<String, Method> methodMap = new HashMap<String, Method>();

        Method[] targetMethods = targetClass.getDeclaredMethods();
        if (null != targetClass && 0 != targetMethods.length) {
            for (Method method : targetMethods) {

                if (method.getName().startsWith(SET)) {
                    methodMap.put(method.getName(), method);
                }
            }
        }
        return methodMap;
    }

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException,
                                          InvocationTargetException, InstantiationException {

        Student student = new Student("xzm", true, 27, new Address("hz"));
        student.setBirthDay(new Date(2011, 11, 1));

        MyBeanUtil myBeanUtil = new MyBeanUtil();

        Object beanCopy = myBeanUtil.beanCopy(student, BakStudent.class);

        System.out.println(beanCopy.toString());
    }
}
 
附件中为完整代码! 

分享到:
评论

相关推荐

    scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetExcep

    标题中的问题“scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetException”是用户在尝试使用Scrcpy时遇到的一个常见错误。这个错误通常意味着在执行某个方法时,Java运行时环境遇到了未预期的情况。...

    解决axis2-CodegenWizardPluginBUG- java.lang.reflect.InvocationTargetException

    然而,在运行此插件时,由于某些原因可能会抛出`java.lang.reflect.InvocationTargetException`,这是一个反射调用异常,通常表示在调用某个方法时发生了异常。 `InvocationTargetException`通常作为Java标准库中的...

    commons-lang3-3.1jar:org.apache.commons.lang3.StringUtils等.

    `org.apache.commons.lang3.reflect.FieldUtils`类则是关于反射操作的工具类,它提供了一些安全且方便的方法来访问和修改对象的字段。这些方法包括但不限于: 1. `getField()`:安全地获取类或对象的字段,即使该...

    Java常用包介绍.pdf

    java.lang.reflect 包提供了用于反射对象的工具,包括类、字段、方法和构造方法的反射。 6. java.awt.image 包 java.awt.image 包处理和操纵来自于网上的图片的Java工具类库,包括图像处理、图像resize和图像滤镜...

    JAVA反射实现和实现机制

    4. **`java.lang.reflect.Method`**:表示类的方法。 5. **`java.lang.reflect.Modifier`**:提供对成员的修饰符的访问。 ##### 基本使用方法 1. **获取成员方法信息**: - `Method[] getMethods()`:获取公开的...

    java 请求的方法不存在(NoSuchMethodException)

    这个异常属于`java.lang`包,通常在动态方法调用或反射操作时抛出。当我们试图通过对象实例或类来执行一个在编译时不可见或者不存在的方法时,就会遇到这个问题。下面我们将深入探讨`NoSuchMethodException`的产生...

    java反射(reflect)

    Java反射(Reflect)是Java语言中的一个重要特性,它允许运行时的Java程序访问、操作类、接口、字段和方法的信息,甚至动态调用方法。在Java编程中,反射提供了强大的能力,可以用来实现一些高级功能,如元编程、...

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    axis2 InvocationTargetException

    4. **配置检查**:检查Axis2的配置文件,如services.xml和服务类的部署描述符,确认它们正确无误,没有遗漏或错误的配置。 5. **依赖库版本**:确认所有依赖库的版本与Axis2版本兼容,不兼容的库可能会引发异常。 ...

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    Java反射机制的实现主要是依赖java.lang.reflect包所提供的类。其中最经常使用的是三个类:java.lang.reflect.Field类、java.lang.reflect.Method类和java.lang.reflect.Constructor类。 Java.lang.reflect.Field...

    什么是java中的反射机制(reflect).docx

    Java 反射机制的实现是通过 java.lang.Class 类和 java.lang.reflect 包来实现的。Class 类代表了 Java 中的一个类,而 java.lang.reflect 包提供了许多反射类,例如 Constructor、Method、Field 等。 Constructor ...

    java类包的介绍与使用

    `java.lang.reflect` 允许程序在运行时检查类和对象的结构。 `java.math` 包提供高精度的数学运算,如 `BigInteger` 和 `BigDecimal`。 `java.net` 包提供了网络编程的类,如 `Socket`, `ServerSocket`, `URL`。 ...

    java的类反射

    4. 动态代理:Java的`java.lang.reflect.Proxy`类可以创建动态代理,用于在方法调用前后添加自定义逻辑,比如AOP(面向切面编程)。 5. 框架开发:Spring框架的依赖注入、Hibernate的数据持久化等都大量使用反射技术...

    Java核心API

    Java.util包包含了大量常用的工具类和集合框架,如List、Map、Set等,是日常开发中最常用的包之一。 #### Java.util.concurrent Java.util.concurrent包自J2SE5起新增,支持并行和并发编程,提供了线程池、锁、信号...

    API规范JAVA.pdf

    * java.lang.reflect 是 Java 2 Platform 的一部分,提供了类和接口,以获得关于类和对象的反射信息。 20、数学运算:java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类...

    aop面向切面需要的jar包

    Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.Access...

    Java常用工具类

    9. **反射:** `java.lang.reflect` 包提供了一系列类和接口,用于获取类的信息,如类名、构造器、方法等,以及动态调用方法和访问属性。 10. **XML处理:** `javax.xml.parsers.DocumentBuilderFactory` 和 `org....

    详解java.lang.reflect.Modifier.isInterface()方法

    `java.lang.reflect`包是Java反射API的一部分,它允许程序在运行时检查类、接口、字段和方法的元数据。`Modifier`类就是这个包中的一员,它提供了一种方便的方式来处理和解释这些元数据中的访问修饰符,如`public`, ...

    常用的java工具类

    - `java.lang.String`:String类是Java中最基础也是最常用的数据类型之一,提供了大量的静态方法进行字符串操作,如`substring()`、`concat()`、`indexOf()`、`replace()`等。 - `java.util.regex`:这个包提供了...

Global site tag (gtag.js) - Google Analytics