精华内容
下载资源
问答
  • Java获取父类的类名

    2021-02-28 09:18:57
    Java语言中,提供了获取类名的方法:getClass().getName(),开发人员可以调用这个方法获取类名。看下列程序:class A{}public class Test extends A{public void Test(){System.out.println (super.getClass()....

    Java语言中,提供了获取类名的方法:getClass().getName(),开发人员可以调用这个方法来获取类名。

    看下列程序:

    class A{}

    public class Test extends A{

    public void Test(){

    System.out.println (super.getClass().getName());

    }

    public static void main(String[] args){

    new Test().test();

    }

    }

    程序运行的结果为:Test

    主要原因在于Java语言中任何类都是继承自Object类,getClass()方法在Object类中被定义为final与native,子类不能覆盖该方法。因此this.getClass()和super.getClass()最终都调用的是Object中的getClass()方法。而Object的getClass()方法的释义是:返回此Object的运行时类。

    可以通过Java的反射机制,使用getClass().getSuperclass().getName()方法来实现

    class A{}

    public class Test extends A{

    public void test(){

    System.out.println(this.getClass().getSuperClass().getName());

    }

    public static void main(String[] args){

    new Test().test();

    }

    }

    程序的运行结果为:A

    展开全文
  • 问题在日常开发中,经常需要获取当前类和父类的所有属性,没办法只能查API了。getDeclaredFields VS getFields查阅API得知,class.getDeclaredFields()能获取所有属性(public、protected、default、private),但不...

    问题

    在日常开发中,经常需要获取当前类和父类的所有属性,没办法只能查API了。

    getDeclaredFields VS getFields

    查阅API得知,class.getDeclaredFields()能获取所有属性(public、protected、default、private),但不包括父类属性,相对的class.getFields() 获取类的属性(public),包括父类;

    显然以上二者都不能满足需求,这么常见的需求,肯定有开源包实现了,功夫不负有心人果然查到了。apache commons包下的FieldUtils.getAllFields()可以获取类和父类的所有(public、protected、default、private)属性。

    为了加深理解,看一下源码

    public static Field[] getAllFields(final Class> cls) {

    final List allFieldsList = getAllFieldsList(cls);

    return allFieldsList.toArray(new Field[allFieldsList.size()]);

    }

    public static List getAllFieldsList(final Class> cls) {

    Validate.isTrue(cls != null, "The class must not be null");

    final List allFields = new ArrayList();

    Class> currentClass = cls;

    while (currentClass != null) {

    final Field[] declaredFields = currentClass.getDeclaredFields();

    for (final Field field : declaredFields) {

    allFields.add(field);

    }

    currentClass = currentClass.getSuperclass();

    }

    return allFields;

    }

    通过class.getDeclaredFields()获取所有的属性,然后再获取类的父类,再获取所有属性,直到父类为null截止;

    获取类和父类的方法

    类似的,API中也有getDeclaredMethods()和getMethods()

    class.getDeclaredMethods() 获取类的所有方法(public、protected、default、private),但不包括继承的方法;

    class.getMethods() 获取当前类和父类的public方法。

    apache commons包提供了MethodUtils.getMethodsWithAnnotation(class,annotation),获取类及父类的注解为annotation的public方法;

    总结

    获取类的所有属性(public、protected、default、private),包括父类的属性,则使用FieldUtils.getAllFields()

    获取类标注某个注解的方法(包括类及父类),使用MethodUtils.getMethodsWithAnnotation(class,annotation)

    展开全文
  • 1. SuperClassReflectionUtils.javapackage zmx.reflect.test;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;.../*** 获取父类中的所有属性和方法 工具类* @aut...

    1. SuperClassReflectionUtils.java

    package zmx.reflect.test;

    import java.lang.reflect.Field;

    import java.lang.reflect.InvocationTargetException;

    import java.lang.reflect.Method;

    /**

    * 获取父类中的所有属性和方法 工具类

    * @author zhangwenchao

    *

    */

    public class SuperClassReflectionUtils {

    /**

    * 循环向上转型, 获取对象的 DeclaredMethod

    * @param object : 子类对象

    * @param methodName : 父类中的方法名

    * @param parameterTypes : 父类中的方法参数类型

    * @return 父类中的方法对象

    */

    public static Method getDeclaredMethod(Object object, String methodName, Class> ... parameterTypes){

    Method method = null ;

    for(Class> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {

    try {

    method = clazz.getDeclaredMethod(methodName, parameterTypes) ;

    return method ;

    } catch (Exception e) {

    //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。

    //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了

    }

    }

    return null;

    }

    /**

    * 直接调用对象方法, 而忽略修饰符(private, protected, default)

    * @param object : 子类对象

    * @param methodName : 父类中的方法名

    * @param parameterTypes : 父类中的方法参数类型

    * @param parameters : 父类中的方法参数

    * @return 父类中方法的执行结果

    */

    public static Object invokeMethod(Object object, String methodName, Class> [] parameterTypes,

    Object [] parameters) {

    //根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象

    Method method = getDeclaredMethod(object, methodName, parameterTypes) ;

    //抑制Java对方法进行检查,主要是针对私有方法而言

    method.setAccessible(true) ;

    try {

    if(null != method) {

    //调用object 的 method 所代表的方法,其方法的参数是 parameters

    return method.invoke(object, parameters) ;

    }

    } catch (IllegalArgumentException e) {

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    } catch (InvocationTargetException e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 循环向上转型, 获取对象的 DeclaredField

    * @param object : 子类对象

    * @param fieldName : 父类中的属性名

    * @return 父类中的属性对象

    */

    public static Field getDeclaredField(Object object, String fieldName){

    Field field = null ;

    Class> clazz = object.getClass() ;

    for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {

    try {

    field = clazz.getDeclaredField(fieldName) ;

    return field ;

    } catch (Exception e) {

    //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。

    //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了

    }

    }

    return null;

    }

    /**

    * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter

    * @param object : 子类对象

    * @param fieldName : 父类中的属性名

    * @param value : 将要设置的值

    */

    public static void setFieldValue(Object object, String fieldName, Object value){

    //根据 对象和属性名通过反射 调用上面的方法获取 Field对象

    Field field = getDeclaredField(object, fieldName) ;

    //抑制Java对其的检查

    field.setAccessible(true) ;

    try {

    //将 object 中 field 所代表的值 设置为 value

    field.set(object, value) ;

    } catch (IllegalArgumentException e) {

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    }

    /**

    * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter

    * @param object : 子类对象

    * @param fieldName : 父类中的属性名

    * @return : 父类中的属性值

    */

    public static Object getFieldValue(Object object, String fieldName){

    //根据 对象和属性名通过反射 调用上面的方法获取 Field对象

    Field field = getDeclaredField(object, fieldName) ;

    //抑制Java对其的检查

    field.setAccessible(true) ;

    try {

    //获取 object 中 field 所代表的属性值

    return field.get(object) ;

    } catch(Exception e) {

    e.printStackTrace() ;

    }

    return null;

    }

    }

    2、测试:

    2.1 Parent.java

    package zmx.reflect.test;

    public class Parent {

    public String publicField = "1";

    String defaultField = "2";

    protected String protectedField = "3";

    private String privateField = "4" ;

    public void publicMethod() {

    System.out.println("publicMethod...");

    }

    void defaultMethod() {

    System.out.println("defaultMethod...");

    }

    protected void protectedMethod() {

    System.out.println("protectedMethod...");

    }

    private void privateMethod() {

    System.out.println("privateMethod...");

    }

    }

    2.2 Son.java

    package zmx.reflect.test;

    public class Son extends Parent{

    }

    2.3 ReflectionUtilsTest.java

    package zmx.reflect.test;

    import java.lang.reflect.Field;

    import java.lang.reflect.Method;

    import org.junit.Test;

    public class ReflectionUtilsTest {

    /**

    * 测试获取父类的各个方法对象

    */

    @Test

    public void testGetDeclaredMethod() {

    Object obj = new Son() ;

    //获取公共方法名

    Method publicMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "publicMethod") ;

    System.out.println(publicMethod.getName());

    //获取默认方法名

    Method defaultMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "defaultMethod") ;

    System.out.println(defaultMethod.getName());

    //获取被保护方法名

    Method protectedMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "protectedMethod") ;

    System.out.println(protectedMethod.getName());

    //获取私有方法名

    Method privateMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "privateMethod") ;

    System.out.println(privateMethod.getName());

    }

    /**

    * 测试调用父类的方法

    * @throws Exception

    */

    @Test

    public void testInvokeMethod() throws Exception {

    Object obj = new Son() ;

    //调用父类的公共方法

    SuperClassReflectionUtils.invokeMethod(obj, "publicMethod", null , null) ;

    //调用父类的默认方法

    SuperClassReflectionUtils.invokeMethod(obj, "defaultMethod", null , null) ;

    //调用父类的被保护方法

    SuperClassReflectionUtils.invokeMethod(obj, "protectedMethod", null , null) ;

    //调用父类的私有方法

    SuperClassReflectionUtils.invokeMethod(obj, "privateMethod", null , null) ;

    }

    /**

    * 测试获取父类的各个属性名

    */

    @Test

    public void testGetDeclaredField() {

    Object obj = new Son() ;

    //获取公共属性名

    Field publicField = SuperClassReflectionUtils.getDeclaredField(obj, "publicField") ;

    System.out.println(publicField.getName());

    //获取公共属性名

    Field defaultField = SuperClassReflectionUtils.getDeclaredField(obj, "defaultField") ;

    System.out.println(defaultField.getName());

    //获取公共属性名

    Field protectedField = SuperClassReflectionUtils.getDeclaredField(obj, "protectedField") ;

    System.out.println(protectedField.getName());

    //获取公共属性名

    Field privateField = SuperClassReflectionUtils.getDeclaredField(obj, "privateField") ;

    System.out.println(privateField.getName());

    }

    @Test

    public void testSetFieldValue() {

    Object obj = new Son() ;

    System.out.println("原来的各个属性的值: ");

    System.out.println("publicField = " + SuperClassReflectionUtils.getFieldValue(obj, "publicField"));

    System.out.println("defaultField = " + SuperClassReflectionUtils.getFieldValue(obj, "defaultField"));

    System.out.println("protectedField = " + SuperClassReflectionUtils.getFieldValue(obj, "protectedField"));

    System.out.println("privateField = " + SuperClassReflectionUtils.getFieldValue(obj, "privateField"));

    SuperClassReflectionUtils.setFieldValue(obj, "publicField", "a") ;

    SuperClassReflectionUtils.setFieldValue(obj, "defaultField", "b") ;

    SuperClassReflectionUtils.setFieldValue(obj, "protectedField", "c") ;

    SuperClassReflectionUtils.setFieldValue(obj, "privateField", "d") ;

    System.out.println("***********************************************************");

    System.out.println("将属性值改变后的各个属性值: ");

    System.out.println("publicField = " + SuperClassReflectionUtils.getFieldValue(obj, "publicField"));

    System.out.println("defaultField = " + SuperClassReflectionUtils.getFieldValue(obj, "defaultField"));

    System.out.println("protectedField = " + SuperClassReflectionUtils.getFieldValue(obj, "protectedField"));

    System.out.println("privateField = " + SuperClassReflectionUtils.getFieldValue(obj, "privateField"));

    }

    }

    展开全文
  • 我们知道,可以通过getDeclaredField和getField方法可以反射获取class中的元素,他们的区别在于getField只能访问公有变量,而getDeclaredField则可以访问定义的所有变量,包括protected修饰和private修饰的变量。...

    我们知道,可以通过getDeclaredField和getField方法可以反射获取class中的元素,他们的区别在于getField只能访问公有变量,而getDeclaredField则可以访问定义的所有变量,包括protected修饰和private修饰的变量。

    // 1.getDeclaredField方法调用searchFields方法

    Field field = searchFields(privateGetDeclaredFields(false), name);

    // 2.getField方法剪接调用searchFields方法

    if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {

    return res;

    }

    不过,若要访问父类中的元素,通过getDeclaredField和getField方法就会抛出NoSuchFieldException异常了。也就是说,无法直接用java.lang.Class中的方法去访问父类中的元素。Spring中的工具类org.springframework.util.ReflectionUtils提供了findField方法,能够取得父类中的元素。我们看一下其中的实现:

    public static Field findField(Class> clazz, String name, Class> type) {

    Assert.notNull(clazz, "Class must not be null");

    Assert.isTrue(name != null || type != null, "Either name or type of the field must be specified");

    Class> searchType = clazz;

    while (!Object.class.equals(searchType) && searchType != null) {

    // 这里一次性获取了类中的所有元素

    Field[] fields = searchType.getDeclaredFields();

    for (Field field : fields) {

    if ((name == null || name.equals(field.getName())) && (type == null || type.equals(field.getType()))) {

    return field;

    }

    }

    // 获取所有父类,接着遍历父类中的元素。

    searchType = searchType.getSuperclass();

    }

    return null;

    }

    笔者本希望通过getDeclaredField()方法直接反射获取class中的元素,不过为了获取其父类中的元素使用了工具类ReflectionUtils。我们通过计算getDeclaredField()方法和ReflectionUtils.findField()方法在1秒内获取类中元素的次数来判断两者的性能。

    public static void main(String[] args) {

    try {

    int times = 0;

    long startMili = System.currentTimeMillis();

    while (true) {

    long nowMili = System.currentTimeMillis();

    InteBidResultDTO.class.getDeclaredField("balance");

    times++;

    if (nowMili > startMili + 1000) {

    break;

    }

    }

    System.out.println("getDeclaredField方法执行了" + times + "次");

    times = 0;

    startMili = System.currentTimeMillis();

    while (true) {

    long nowMili = System.currentTimeMillis();

    ReflectionUtils.findField(InteBidResultDTO.class, "balance");

    times++;

    if (nowMili > startMili + 1000) {

    break;

    }

    }

    System.out.println("findField方法执行了" + times + "次");

    } catch (SecurityException | NoSuchFieldException e) {

    e.printStackTrace();

    }

    }

    运行结果是:

    getDeclaredField方法执行了3200996次

    findField方法执行了2434921次

    由于ReflectionUtils.findField()方法会去查找父类中的元素,性能必然会差一些。如果一个类的父类祖先越多,遍历次数也就越多,上述运行结果的差距也就更加明显。

    展开全文
  • 这里将告诉您java反射获取父类和子类字段值、赋值,具体操作过程:java反射获取字段值、赋值import org.springframework.util.ReflectionUtils;import java.lang.reflect.Field;import java.util.*;public static void...
  • 要求:获取父类的私有id的属性值(传进来的是一个泛型T)反射流程,是先获取到class对象,然后通过Field来获取对象的属性方法常用的方法是:getFields 可以获取自身和继承公共的属性getDeclaredFields 可以获取公共和...
  • 三、问题解决 下面说一种解决方案,就是通过getSuperclass方法获取父类再调用getDeclaredField方法 public int compare(T o1, T o2) { if (paramName == null || paramName.isEmpty() || o1 == o2) { return 0;...
  • 使Java父类方法返回子类对象的方法

    千次阅读 2021-02-25 20:35:27
    小编典典如果您只是在寻找针对已定义子类的方法链,那么以下方法应该有效:public class Parent {public T example() {System.out.println(this.getClass().getCanonicalName());return (T)this;}}如果愿意,可以是...
  • package .../*** 父类* @author syh**/public class Parent {public String publicField = "1";String defaultField = "2";protected String protectedField = "3";private String privat...
  • 今天遇到一个需求,需要在很多...为了避免这种情况发生,引发以后的代码危机,我使用了Java的反射+泛型解决了这个问题./*** 使用泛型+反射设置表单流程状态*/public Page getFormStatus(Page page){//遍历List集...
  • getDeclaredMethods方法的注释: Returns an array containing Method objects reflecting all the declared methods of the class or interface represented by this Class object, including public, protected, ...
  • public final class ReflectionUtils { public static Method getDeclaredMethod(Object object, String methodName, Class<?> ...... Method method = null ; for(Class<?... clazz = object.getClass() ;...
  • 先看下反射机制是如何获取类的方法的:Class clazz = object.getClass();clazz.getDeclaredFields();clazz.getFields()​ 通过getClass()方法获取类的定义信息,通过定义信息再调用getFields()方法获取类的所有...
  • 它们都有一个共同的方法结果.如果我有foobarbaz的实例,是否可以调用其父/祖父母的结果方法?public class Foo {protected int resultA;public void calc(){ resultA=...}public void result(){ return resultA; }}...
  • java子类调用父类方法中包含子类重写的实例方法# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了# 先看代码:public class Common {public static void main(String[] args) {Sub sub = new Sub();...
  • 最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢...
  • 下面是工具类package ...import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.lang.ref...
  • 1.普通父类的静态变量和方法,可以通过子类的名称访问和调用 2.普通父类的静态变量和方法,可以通过子类的实例对象访问和调用 3.抽象父类的静态变量和方法,可以通过具体子类的名称访问和调用 4.抽象父类的静态变量...
  • 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.2. 参数成员只能用public或默认(default)这两个访问权修饰3. 参数成...
  • 其中有反射的一个坑,工具类某方法反射获取传入Model的属性值.但是当我把公共属性抽出来做基类的时候,发现获取不到基类的属性值了.原因是使用了getDeclaredFields();分析方法功能getFields()获取所有public字段,包...
  • 先看下反射机制是如何获取类的方法的: Class clazz = object.getClass(); clazz.getDeclaredFields(); clazz.getFields()getClass()方法获取类的定义信息,通过定义信息再调用getFields()方法获取类的所有公共...
  • Java反射获取private属性和方法(子类,父类,祖先….)先来看一个例子:String可变还是不可变?大家都应该知道,或者听过,String类是不可变的,为什么呢?因为String其实使用一个private final char [] value;来保存...
  • 对于继承的父类的字段无效getFields方法只能获取类及其父类的公共字段获取父类的私有字段需要先使用getSuperClass获取父类Class,然后通过父类Class的getDeclaredFields方法获取父类的所有字段下面我们举个简单的...
  • 获取接口的包.–>加载包中所有的类–>遍历. 是否为实现类 一般的包结构都是 实现类放在 接口同级的impl包下; 代码: private static Set<Class<?>> getInstances(Class supClass) { String a...
  • 最近在Android项目开发中使用一种写法,就是在BaseActivity中添加如下方法public String getActivityName() {return this.getClass().getName();}这样在打印日志时加上这个函数可以方便的定位到对应的Activity类,...
  • Java继承关系中,子类其实继承了父类的全部方法和属性,只是没有权限访问父类的私有成员。 import java.lang.reflect.AccessibleObject; import java.lang.reflect.Method; class Father{ private String name...
  • 再idea中,如果实现了接口,那么引用接口中的方法是很简单的,如果我们是继承了抽象类,而又要重写该抽象类中不是抽象方法方法,那就很麻烦了。 快捷键 : crtl+o ...快速导出父类中的普通方法。 ...
  • packagecom.winway.fullmoni.dataplug....importjava.io.File;importjava.net.URL;importjava.util.ArrayList;importjava.util.List;importcom.winway.fullmoni.dataplug.base.ZQBaseController;public clas...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 244,110
精华内容 97,644
关键字:

java获取父类方法

java 订阅