java怎么获取某个父类(或接口)的所有子类

java怎么获取某个父类(或接口)的所有子类,第1张

class parent{

/

获取子类的类名

/

public String getClassName(){

return thisgetClass()getSimpleName();

}

//父类中直接调用

String className = getClassName();

}

限定!)利用它的单调性求最值与利用均值不等式

spring要使用20版本支持注解的方式 才可以

在你的类里面这样写就可以了

@Resource private BaseService BaseService;

还有你的<bean>命名最好全都小写,有大写的可能会发生异常哦

<bean id="BaseDao" class="comtsinghuadaoimplBaseDaoimpl">

<property name="sessionFactory"><ref bean="sessionFactory" /></property>

</bean>

<bean id="BaseService" class="comtsinghuaserviceBaseServiceimpl">

<property name="basedao"><ref bean="BaseDao" /></property>

</bean>

1将BaseDao的sessionFactory用注解方式注入

2将BaseService的BaseDao用注解方式注入

Spring会自动判断父类

java反射获取属性值是怎样的呢?一起来看下吧:

反射获取Java类的所有字段,包括所有父类中的字段。类自身的字段可直接通过方法getDeclaredFields()(获取所有修饰符字段)或者getFields()(获取public修饰的字段)获取,但父类中的字段暂时没有发现直接获取的方式。 需要递归获取所有的父类,然后获取他们的字段,最终获取到类的所有字段。 

如果要获取字段值,则需要设置字段可访问:fieldsetAccessible(true);  field为reflect包下的Field类

案例:

1、父类

package comcarlstudyspringbootbean;   import lombokData; import lombokexperimentalAccessors;   /   @author changez   @desc   @date 2019/3/10 11:30  / @Data @Accessors(chain = true) public class BeanBasic {    private Integer id;  private Long createTime;  private Long updateTime; }

2、子类

package comcarlstudyspringbootbean;   import lombokData; import lombokEqualsAndHashCode; import lombokToString; import lombokexperimentalAccessors;   /   @author changez   @desc   @date 2019/3/10 11:17  / @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @Accessors(chain = true) public class Student extends BeanBasic{    private String name;  private String address; }

3、测试类

package testlombok;   import comcarlstudyspringbootbeanStudent; import orgjunitTest;   import javalangreflectField; import javautilArrayList; import javautilArrays; import javautilList;   /   @author changez   @desc Java反射获取类的所有属性   @date 2019/3/10 11:41  / public class LombokTest {    @Test  public void getParentField(){   Student stu1 = new Student();   stu1setName("student-name")    setAddress("student1-address")    setId(1)    setCreateTime(20190310140423L)    setUpdateTime(20190310140423L)   ;     Class clazz = Studentclass;   List allFields = new ArrayList(100);     // 获取当前对象的所有属性字段   // clazzgetFields():获取public修饰的字段   // clazzgetDeclaredFields(): 获取所有的字段包括private修饰的字段   allFieldsaddAll(ArraysasList(clazzgetDeclaredFields()));     // 获取所有父类的字段, 父类中的字段需要逐级获取   Class clazzSuper = clazzgetSuperclass();     // 如果父类不是object,表明其继承的有其他类。 逐级获取所有父类的字段   while (clazzSuper != Objectclass) {    allFieldsaddAll(ArraysasList(clazzSupergetDeclaredFields()));    clazzSuper = clazzSupergetSuperclass();   }     allFieldsstream()forEach(field -> {      // 设置字段可访问, 否则无法访问private修饰的变量值    fieldsetAccessible(true);    try {     // 获取字段名称     String fieldName = fieldgetName();       // 获取指定对象的当前字段的值     Object fieldVal = fieldget(stu1);     Systemoutprintln(fieldName+"="+fieldVal);    } catch (IllegalAccessException e) {     eprintStackTrace();    }   });  } }

哥们你看好了,我和你一样也是初学者,你的问题,也是前几天我的问题;

这玩意我在Java群里面也问过,搞了十年Java的也说不出个123来还动用了什么debug测试工具,当然这个玩意以后我们也会用到!

我告诉你步骤怎么回事:

当你newY的时候,注意,还没有产生对象的时候,就执行了一个动作就是加载CLASS文件这个动作!

class文件已加载,就开始动用分配内存的动作,懂

3此时分配的对象有,方法区,父类方法,和子类方法:(这里说的覆盖其实只是就近原则而已,其实没有覆盖如果你不理解,你可以看看Java内存分析)

4还分配了成员变量,在堆里面分配,注意:(堆内存,分配了子类和父类变量其实都有的,是划分开的切记:两个类里面的i都给划分了空间)

5此时堆内存的所有变量,都是默认值,int就是0;这个步骤称为:隐式初始化!以上是加载class后就发生的动作懂了

6然后子类继承了父类,父类动作必然先执行父类里面的构造函数,开始执行初始化动作

(注意:构造函数是用来初始化动作的,能给本类对象初始化,也能给子类对象初始化切记!)

7父类,启用构造函数先把自己的i=2给赋值完毕(显示初始化动作);

就开始执行构造函数里面的其他语句;这里就是你写的那个方法display();

父类读这个方法的时候,回去方法区里面找方法,他优先找子类,如果子类没有,在找他自己的,此刻子类是有的,也称之为覆盖

(说明一下,其实父类方法也在的)

8此刻调用的子类方法,子类里面调用了i,(此时父类的i已经是2了,但是子类i还是0,懂了但是方法找变量的时候会优先找子类懂了当然k也是0了)

9父类读完你这个调用以后就会把子类所有的成员变量初始化完成,称之为(显示初始化动作,就是我们能看的见的数字)

10如果你在new完成以后,你在调用,你会发现,都是有值的了!

11补充下:哥们纯手工靠记忆敲打出来的;

这个是我个人纠结了好几天以后总结的,总结的不到位还请指点,有大佬指引我,遇见这问题可以先记起来,以后学到多线程,很容易就可以理解!

祝你Java越来越厉害,顺便也期望我也一样吧,呵呵!!

注解的使用一般是与java的反射一起使用,下面是一个例子

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

自定义注解及其应用

1)、定义一个最简单的注解

public @interface MyAnnotation {

//

}

2)、把注解加在某个类上:

@MyAnnotation

public class AnnotationTest{

//

}

以下为模拟案例

自定义注解@MyAnnotation

1 package comljqtest;

2

3 import javalangannotationElementType;

4 import javalangannotationRetention;

5 import javalangannotationRetentionPolicy;

6 import javalangannotationTarget;

7

8 /

9 定义一个注解

10

11

12 @author jiqinlin

13

14 /

15 //Java中提供了四种元注解,专门负责注解其他的注解,分别如下

16

17 //@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:

18 //RetentionPolicySOURCE: 停留在java源文件,编译器被丢掉

19 //RetentionPolicyCLASS:停留在class文件中,但会被VM丢弃(默认)

20 //RetentionPolicyRUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息

21

22 //@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括

23 //ElementTypeCONSTRUCTOR: 构造器声明

24 //ElementTypeFIELD: 成员变量、对象、属性(包括enum实例)

25 //ElementTypeLOCAL_VARIABLE: 局部变量声明

26 //ElementTypeMETHOD: 方法声明

27 //ElementTypePACKAGE: 包声明

28 //ElementTypePARAMETER: 参数声明

29 //ElementTypeTYPE: 类、接口(包括注解类型)或enum声明

30

31 //@Documented将注解包含在JavaDoc中

32

33 //@Inheried允许子类继承父类中的注解

34

35

36 @Retention(RetentionPolicyRUNTIME)

37 @Target({ElementTypeMETHOD, ElementTypeTYPE})

38 public @interface MyAnnotation {

39 //为注解添加属性

40 String color();

41 String value() default "我是林计钦"; //为属性提供默认值

42 int[] array() default {1, 2, 3};

43 Gender gender() default GenderMAN; //添加一个枚举

44 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期为1988-2-18");

45 //添加枚举属性

46

47 }

注解测试类AnnotationTest

1 package comljqtest;

2

3 /

4 注解测试类

5

6

7 @author jiqinlin

8

9 /

10 //调用注解并赋值

11 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期为1988-2-18"),color="red", array={23, 26})

12 public class AnnotationTest {

13

14 public static void main(String[] args) {

15 //检查类AnnotationTest是否含有@MyAnnotation注解

16 if(AnnotationTestclassisAnnotationPresent(MyAnnotationclass)){

17 //若存在就获取注解

18 MyAnnotation annotation=(MyAnnotation)AnnotationTestclassgetAnnotation(MyAnnotationclass);

19 Systemoutprintln(annotation);

20 //获取注解属性

21 Systemoutprintln(annotationcolor());

22 Systemoutprintln(annotationvalue());

23 //数组

24 int[] arrs=annotationarray();

25 for(int arr:arrs){

26 Systemoutprintln(arr);

27 }

28 //枚举

29 Gender gender=annotationgender();

30 Systemoutprintln("性别为:"+gender);

31 //获取注解属性

32 MetaAnnotation meta=annotationmetaAnnotation();

33 Systemoutprintln(metabirthday());

34 }

35 }

36 }

枚举类Gender,模拟注解中添加枚举属性

1 package comljqtest;

2 /

3 枚举,模拟注解中添加枚举属性

4

5 @author jiqinlin

6

7 /

8 public enum Gender {

9 MAN{

10 public String getName(){return "男";}

11 },

12 WOMEN{

13 public String getName(){return "女";}

14 }; //记得有“;”

15 public abstract String getName();

16 }

注解类MetaAnnotation,模拟注解中添加注解属性

1 package comljqtest;

2

3 /

4 定义一个注解,模拟注解中添加注解属性

5

6 @author jiqinlin

7

8 /

9 public @interface MetaAnnotation {

10 String birthday();

11 }

以上就是关于java怎么获取某个父类(或接口)的所有子类全部的内容,包括:java怎么获取某个父类(或接口)的所有子类、关于怎么 Spring注解的方式 指定parent属性、java反射获取属性值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10128784.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存