1、提供结构丰富Person类

1.1、Person类

  1. @MyAnnotation(value="java")
  2. public class Person extends Creature<String> implements Comparable<String>,MyInterface{
  3. private String name;
  4. int age;
  5. public int id;
  6. public Person() {
  7. }
  8. @MyAnnotation(value="C++")
  9. Person(String name){
  10. this.name = name;
  11. }
  12. private Person(String name,int age){
  13. this.name = name;
  14. this.age = age;
  15. }
  16. @MyAnnotation
  17. private String show(String nation){
  18. System.out.println("我来自" + nation + "星系");
  19. return nation;
  20. }
  21. @Override
  22. public void info() {
  23. System.out.println("火星喷子");
  24. }
  25. public String display(String play){
  26. return play;
  27. }
  28. @Override
  29. public int compareTo(String o) {
  30. return 0;
  31. }
  32. }

1.2、Creature类

  1. import java.io.Serializable;
  2. public abstract class Creature <T> implements Serializable {
  3. private char gender;
  4. public double weight;
  5. private void breath(){
  6. System.out.println("太阳系");
  7. }
  8. public void eat(){
  9. System.out.println("银河系");
  10. }
  11. }

1.3、MyInterface

  1. public interface MyInterface {
  2. void info();
  3. }

1.4、MyAnnotation

  1. import java.lang.annotation.Retention;
  2. import java.lang.annotation.RetentionPolicy;
  3. import java.lang.annotation.Target;
  4. import static java.lang.annotation.ElementType.*;
  5. @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
  6. @Retention(RetentionPolicy.RUNTIME)
  7. public @interface MyAnnotation {
  8. String value() default "hello world";
  9. }

2、获取运行时类的属性结构及其内部结构

2.1、Person类

  1. package github2;
  2. @MyAnnotation(value="java")
  3. public class Person extends Creature<String> implements Comparable<String>,MyInterface{
  4. private String name;
  5. int age;
  6. public int id;
  7. public Person() {
  8. }
  9. @MyAnnotation(value="C++")
  10. Person(String name){
  11. this.name = name;
  12. }
  13. private Person(String name,int age){
  14. this.name = name;
  15. this.age = age;
  16. }
  17. @MyAnnotation
  18. private String show(String nation){
  19. System.out.println("我来自" + nation + "星系");
  20. return nation;
  21. }
  22. @Override
  23. public void info() {
  24. System.out.println("火星喷子");
  25. }
  26. public String display(String play){
  27. return play;
  28. }
  29. @Override
  30. public int compareTo(String o) {
  31. return 0;
  32. }
  33. }

2.2、测试类

  • getFields():获取当前运行时类及其父类中声明为public访问权限的属性
  • getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
  • getModifiers():获取当前运行时类的权限修饰符
  • getType():获取当前运行时类的数据类型
  • getName():获取当前运行时类的变量名 ```java import github2.Person; import org.junit.Test;

import java.lang.reflect.Field; import java.lang.reflect.Modifier;

/**

  • 获取当前运行时类的属性结构 */ public class FieldTest {

    @Test public void test(){

    1. Class clazz = Person.class;
    2. //获取属性结构
    3. //getFields():获取当前运行时类及其父类中声明为public访问权限的属性
    4. Field[] fields = clazz.getFields();
    5. for(Field f : fields){
    6. System.out.println(f);
    7. }
    8. System.out.println("++++++++++++++++++");
    9. //getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
    10. Field[] declaredFields = clazz.getDeclaredFields();
    11. for(Field f : declaredFields){
    12. System.out.println(f);
    13. }

    }

    //权限修饰符 数据类型 变量名 @Test public void test2(){

    1. Class clazz = Person.class;
    2. Field[] declaredFields = clazz.getDeclaredFields();
    3. for(Field f : declaredFields){
    4. //1.权限修饰符
    5. int modifier = f.getModifiers();
    6. System.out.print(Modifier.toString(modifier) + "\t");
    7. System.out.println("+++++++++++++++++++++++++++");
    8. //2.数据类型
    9. Class type = f.getType();
    10. System.out.print(type.getName() + "\t");
    11. System.out.println("***************************");
    12. //3.变量名
    13. String fName = f.getName();
    14. System.out.print(fName);
    15. }

    } }

  1. <a name="z3cbQ"></a>
  2. # 3、获取运行时类的方法结构
  3. - **getMethods():**获取当前运行时类及其所有父类中声明为public权限的方法
  4. - **getDeclaredMethods():**获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
  5. ```java
  6. package github3;
  7. import github2.Person;
  8. import org.junit.Test;
  9. import java.lang.reflect.Method;
  10. /**
  11. * 获取运行时类的方法结构
  12. */
  13. public class MythodTest {
  14. @Test
  15. public void test(){
  16. Class clazz = Person.class;
  17. //getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
  18. Method[] methods = clazz.getMethods();
  19. for(Method m : methods){
  20. System.out.println(m + "****");
  21. }
  22. System.out.println("++++++++++++++++++++++++++++");
  23. //getDeclaredMethods():获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
  24. Method[] declaredMethods = clazz.getDeclaredMethods();
  25. for(Method m : declaredMethods){
  26. System.out.println(m);
  27. }
  28. }
  29. }

4、获取运行时类的方法的内部结构

  • getAnnotations():获取方法声明的注解
  • getModifiers():获取方法的权限修饰符
  • getReturnType().getName():获取方法返回值类型
  • getName():返回方法名
  • getParameterTypes():返回形参列表
  • getExceptionTypes():返回抛出的异常 ```java package github3;

import github2.Person; import org.junit.Test;

import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier;

/**

  • 获取运行时类的方法结构 */ public class MythodTest {

    /**

    • @Xxxx
    • 权限修饰符 返回值类型 方法名(参数类型1 形参名1,…) throws XxxException{} */ @Test public void test2() { Class clazz = Person.class; Method[] declaredMethods = clazz.getDeclaredMethods(); for (Method m : declaredMethods) {

      1. //1.获取方法声明的注解
      2. Annotation[] annos = m.getAnnotations();
      3. for (Annotation a : annos) {
      4. System.out.println(a + "KKKK");
      5. }
      6. //2.权限修饰符
      7. System.out.print(Modifier.toString(m.getModifiers()) + "\t");
      8. //3.返回值类型
      9. System.out.print(m.getReturnType().getName() + "\t");
      10. //4.方法名
      11. System.out.print(m.getName());
      12. System.out.print("(");
      13. //5.形参列表
      14. Class[] pTs = m.getParameterTypes();
      15. if(!(pTs == null && pTs.length == 0)){
      16. for(int i = 0;i < pTs.length;i++){
      17. if(i == pTs.length - 1){
      18. System.out.print(pTs[i].getName() + " args_" + i);
      19. break;
      20. }
      21. System.out.print(pTs[i].getName() + " args_" + i + ",");
      22. }
      23. }
      24. System.out.print(")");
      25. //6.抛出的异常
      26. Class[] eTs = m.getExceptionTypes();
      27. if(eTs.length > 0){
      28. System.out.print("throws ");
      29. for(int i = 0;i < eTs.length;i++){
      30. if(i == eTs.length - 1){
      31. System.out.print(eTs[i].getName());
      32. break;
      33. }
      34. System.out.print(eTs[i].getName() + ",");
      35. }
      36. }
      37. System.out.println("TQA");

      } }

}

  1. <a name="HBGzQ"></a>
  2. # 5、获取运行时类的构造器结构
  3. - **getConstructors()**:获取当前运行时类中声明为public的构造器
  4. - **getDeclaredConstructors()**:获取当前运行时类中声明的所有的构造器
  5. ```java
  6. package github3;
  7. import github2.Person;
  8. import org.junit.Test;
  9. import java.lang.reflect.Constructor;
  10. public class OtherTest {
  11. /**
  12. * 获取构造器的结构
  13. */
  14. @Test
  15. public void test(){
  16. Class clazz = Person.class;
  17. //getConstructors():获取当前运行时类中声明为public的构造器
  18. Constructor[] constructors = clazz.getConstructors();
  19. for(Constructor c : constructors){
  20. System.out.println(c);
  21. }
  22. System.out.println("************************");
  23. //getDeclaredConstructors():获取当前运行时类中声明的所有的构造器
  24. Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
  25. for(Constructor c : declaredConstructors){
  26. System.out.println(c);
  27. }
  28. }
  29. }

6、获取运行时类的父类及父类的泛型

  • getSuperclass():获取运行时类的父类
  • getGenericSuperclass():获取运行时类的带泛型的父类
  • getActualTypeArguments():获取运行时类的带泛型的父类的泛型 ```java package github3;

import github2.Person; import org.junit.Test;

import java.lang.reflect.Constructor; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;

public class OtherTest { /**

  1. * 获取运行时类的父类
  2. */
  3. @Test
  4. public void test2(){
  5. Class clazz = Person.class;
  6. Class superclass = clazz.getSuperclass();
  7. System.out.println(superclass);
  8. }
  9. /**
  10. * 获取运行时类的带泛型的父类
  11. */
  12. @Test
  13. public void test3(){
  14. Class clazz = Person.class;
  15. Type genericSuperclass = clazz.getGenericSuperclass();
  16. System.out.println(genericSuperclass);
  17. }
  18. /**
  19. * 获取运行时类的带泛型的父类的泛型
  20. */
  21. @Test
  22. public void test4(){
  23. Class clazz = Person.class;
  24. Type genericSuperclass = clazz.getGenericSuperclass();
  25. ParameterizedType paramType = (ParameterizedType) genericSuperclass;
  26. //获取泛型类型
  27. Type[] actualTypeArguments = paramType.getActualTypeArguments();

// System.out.println(actualTypeArguments[0].getTypeName()); System.out.println(((Class)actualTypeArguments[0]).getName()); } }

  1. <a name="RqVXr"></a>
  2. # 7、获取运行时类的接口、所在包、注解等
  3. - **getInterfaces()**:获取运行时类实现的接口
  4. - getSuperclass().**getInterfaces()**:获取运行时类的父类实现的接口
  5. - **getPackage()**:获取运行时类所在的包
  6. - **getAnnotations()**:获取运行时类声明的注解
  7. ```java
  8. package github3;
  9. import github2.Person;
  10. import org.junit.Test;
  11. import java.lang.annotation.Annotation;
  12. import java.lang.reflect.Constructor;
  13. import java.lang.reflect.ParameterizedType;
  14. import java.lang.reflect.Type;
  15. public class OtherTest {
  16. /**
  17. * 获取运行时类实现的接口
  18. */
  19. @Test
  20. public void test5(){
  21. Class clazz = Person.class;
  22. Class[] interfaces = clazz.getInterfaces();
  23. for(Class c : interfaces){
  24. System.out.println(c);
  25. }
  26. System.out.println("++++++++++++++++++++++");
  27. //获取运行时类的父类实现的接口
  28. Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
  29. for(Class c : interfaces1){
  30. System.out.println(c);
  31. }
  32. }
  33. /**
  34. * 获取运行时类所在的包
  35. */
  36. @Test
  37. public void test6(){
  38. Class clazz = Person.class;
  39. Package pack = clazz.getPackage();
  40. System.out.println(pack);
  41. }
  42. /**
  43. * 获取运行时类声明的注解
  44. */
  45. @Test
  46. public void test7(){
  47. Class clazz = Person.class;
  48. Annotation[] annotations = clazz.getAnnotations();
  49. for(Annotation annos : annotations){
  50. System.out.println(annos);
  51. }
  52. }
  53. }