java 經過反射獲取類屬性結構,類方法,類父類及其泛型,類,接口和包

首先自定義三個類java

package reflection1; public interface MtInterface { void info(); }
package reflection1; import java.io.Serializable; public class Creature<T> implements Serializable { private char gender; public double weight; private void breath() { System.out.println("呼吸"); } public void eat() { System.out.println("吃飯"); } }
package reflection1; public class Person extends Creature<String> implements Comparable<String>,MtInterface { private String name; int age; public int id; public Person() { super(); } private Person(String name) { super(); this.name = name; } Person(String name, int age) { super(); this.name = name; this.age = age; } public Person(String name, int age, int id) { super(); this.name = name; this.age = age; this.id = id; } private String show(String nation) { System.out.println("nation="+nation); return nation; } public String display(String interests) { return interests; } @Override public void info() { System.out.println("我是人"); } @Override public int compareTo(String o) { return 0; } private static void showDesc() { System.out.println("i am zsben"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", id=" + id + "]"; } }

而後經過反射獲取類屬性結構api

package reflection2; import java.lang.module.ModuleDescriptor.Exports.Modifier; import java.lang.reflect.Field; import org.junit.jupiter.api.Test; import reflection1.*; /* * 獲取當前運行時類的屬性結構 * */

public class FieldTest { @Test public void test1() { Class clazz = Person.class; //獲取屬性結構 //getFields():獲取當前運行時類及其父類中全部public的屬性
        Field [] fields = clazz.getFields(); for(Field f:fields) System.out.println(f); System.out.println(""); //getDeclaredFields():得到當前運行時類的全部屬性,不包含父類的屬性,不考慮權限
        fields = clazz.getDeclaredFields(); for(Field f:fields) System.out.println(f); System.out.println(""); } //權限修飾符:數據類型 變量名
 @Test public void test2() { Class clazz = Person.class; Field [] fields = clazz.getDeclaredFields(); for(Field f:fields) { System.out.println(f); //1.權限修飾符
            int modifiers = f.getModifiers(); System.out.println(modifiers); //2.數據類型
            Class type = f.getType(); System.out.println(type); //3.變量名
            String name = f.getName(); System.out.println(name); System.out.println(""); } } }
View Code

獲取類方法ide

package reflection2; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import org.junit.jupiter.api.Test; import reflection.Person; /* * 獲取運行時類的方法結構 * * */

public class MethodTest { @Test public void test1() { Class clazz = Person.class; //getMethods():獲取當前類及其父類全部public方法
        Method[] methods = clazz.getMethods(); for(Method m:methods) { System.out.println(m); } System.out.print('\n'); //獲取當前運行時類中的全部方法
        methods = clazz.getDeclaredMethods(); for(Method m:methods) { System.out.println(m); } } /* * 權限修飾符,返回值類型,方法名(參數類型1 參數1,參數類型2 參數2,參數類型3 參數3...) * */ @Test public void test2() { //1.獲取方法聲明的註解
        Class clazz = Person.class; Method[]methods = clazz.getDeclaredMethods(); for(Method m:methods) { System.out.println(m); //1.得到方法聲明的註解
            Annotation[] annos = m.getAnnotations(); for(Annotation a:annos) { System.out.println(a); } //2.獲取權限修飾符
            int modifier = m.getModifiers(); System.out.println(modifier); //3.返回值類型
 System.out.println(m.getReturnType().getName()); //4.方法名
 System.out.println(m.getName()); //5.形參列表
            Class [] parameterTypes = m.getParameterTypes(); if(!(parameterTypes == null && parameterTypes.length==0)) { for(int i=0;i<parameterTypes.length;i++) { Class p = parameterTypes[i]; System.out.println(p.getName()+" args_"+i); } } //6.拋出的異常
            Class [] exceptionTypes = m.getExceptionTypes(); for(Class e:exceptionTypes) System.out.println(e.getName()); } } }
View Code

父類及其泛型,所在包,接口this

package reflection2; import java.lang.reflect.Constructor; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import reflection1.Person; public class OtherTest { /* * 獲取構造器結構 * */ @Test public void test1() { Class clazz = Person.class; Constructor[] constructors = clazz.getConstructors(); for(Constructor c:constructors) System.out.println(c); System.out.println(); constructors = clazz.getDeclaredConstructors(); for(Constructor c:constructors) System.out.println(c); } /* * 獲取運行時類的父類 * */ @Test public void test2() { Class clazz = Person.class; Class superClass = clazz.getSuperclass(); System.out.println(superClass); } /* * 獲取運行時帶泛型的父類 * */ @Test public void test3() { Class clazz = Person.class; Type superClass = clazz.getGenericSuperclass(); System.out.println(superClass); } /* * 獲取運行時帶泛型的父類的泛型 * */ @Test public void test4() { Class clazz = Person.class; Type superClass = clazz.getGenericSuperclass(); ParameterizedType paramType = (ParameterizedType)superClass; //獲取泛型類型
         Type[] types = paramType.getActualTypeArguments(); System.out.println(types[0].getTypeName()); } /* * 獲取運行時類的接口 * */ @Test public void test5() { Class clazz = Person.class; Class[] interfaces = clazz.getInterfaces(); for(Class c:interfaces) System.out.println(c); System.out.println(); Class[]interfaces1 = clazz.getSuperclass().getInterfaces(); for(Class c:interfaces1) System.out.println(c); } /* * 獲取類運行時所在包 * */ @Test public void test6() { Class clazz = Person.class; Package package1 = clazz.getPackage(); System.out.println(package1); } }
View Code
相關文章
相關標籤/搜索