java反射(1) 通过反射查看类的信息

  1. 前面说过,java在加载一个类的时候,会创建一个对应的class对象,通过这个class对象可以访问到类本身的信息,这就是反射的一种简单的应用。
  2. 下面的代码就时通过一个名为class的方法通过反射的方式获得类本身,在通过其他大量的方法来获得类的信息,具体的讲解穿插在代码之中,在前面需要指出的时,通过getConstructor()可以获得被private修饰的构造方法,但是getMethod()却不可以获得被private修饰的方法
    package Chapter_3;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    @SuppressWarnings(value = "unchecked")
    @Deprecated
    public class ClassTest {
    
    //    定义一个私有的构造器
        private ClassTest(){
    
        }
    
    
        private void p(){}
    
    //    定义一个有参数的构造器
        public ClassTest(String name){
            System.out.println("我执行带有参数的构造器");
        }
    
    //    定义一个无参数的info方法
        public void info(){
            System.out.println("我执行无参数的info方法");
        }
    
    //    定义一个又参数的info方法
        public void info(String str){
            System.out.println("我执行带参数的info方法" +".其参数为" + str);
        }
    
    //    定义一个内部类
        class Inner{ }
    
        public static void main(String args[]) throws Exception{
    
            Class clazz = ClassTest.class;
    //        上面这行代码可以获取ClassTest对应的class
    
            Constructor[] ctors = clazz.getDeclaredConstructors();
    //        获取该class对象对应类全部的构造器
    
    //        依次输出
            System.out.println("ClassTest的全部构造器如下:");
            for(Constructor c : ctors){
                System.out.println(c);
            }
    
    //        获取该class对象对应类的全部构造方法
            Constructor[] publicCtors = clazz.getConstructors();
    
    //        依次输出
            System.out.println("Clazz的全部构造器如下:");
            for(Constructor c : publicCtors){
                System.out.println(c);
            }
    
    //        获取该class对象对应类的所有public方法
            Method[] mtds = clazz.getMethods();
    
    //        依次输出
            System.out.println("ClassTest的全部public方法如下:");
            for(Method md : mtds){
                System.out.println(md);
            }
    
    //        输出class对应类里名为info,参数为字符串的方法
            System.out.println("Class里带有一个字符串的info方法为:"
                    + clazz.getMethod("info", String.class));
    
    //        获取class对象对应类
            Annotation[] anns = clazz.getAnnotations();
    
    //        依次输出
            System.out.println("ClassTest的全部Annotation如下:");
            for(Annotation an : anns){
                System.out.println(an);
            }
    
    //        获取class对应类里名字为SuppressWarnings的注释
            System.out.println("该Class元素上的@SupportWanning注释为: "
                    + clazz.getAnnotation(SuppressWarnings.class));
    
    //        获取class对象对应类里所有的内部类
            Class[] inners = clazz.getDeclaredClasses();
    
    //        依次输出
            System.out.println("Class的所有内部类如下:");
            for(Class c : inners){
                System.out.println(c);
            }
    
    //        使用forName方法加载ClassTest里名字为Inner的内部类
            Class inClazz  = Class.forName("Chapter_3.ClassTest$Inner");
    
    //        依次输出内部类的各种属性
            System.out.println("inClass对应类的外部类为:"+ inClazz.getDeclaringClass());
            System.out.println("inClass对应的外部类为" + inClazz.getDeclaringClass());
            System.out.println("ClassTest对应的包为: " +  clazz.getPackage());
            System.out.println("ClassTest对应的父类为" + clazz.getSuperclass());
    
        }
    }
    
    /*
    程序运行后,得到输出:
        ClassTest的全部构造器如下:
        private Chapter_3.ClassTest()
        public Chapter_3.ClassTest(java.lang.String)
        Clazz的全部构造器如下:
        public Chapter_3.ClassTest(java.lang.String)
        ClassTest的全部public方法如下:
        public static void Chapter_3.ClassTest.main(java.lang.String[]) throws java.lang.Exception
        public void Chapter_3.ClassTest.info(java.lang.String)
        public void Chapter_3.ClassTest.info()
        public final void java.lang.Object.wait() throws java.lang.InterruptedException
        public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
        public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
        public boolean java.lang.Object.equals(java.lang.Object)
        public java.lang.String java.lang.Object.toString()
        public native int java.lang.Object.hashCode()
        public final native java.lang.Class java.lang.Object.getClass()
        public final native void java.lang.Object.notify()
        public final native void java.lang.Object.notifyAll()
        Class里带有一个字符串的info方法为:public void Chapter_3.ClassTest.info(java.lang.String)
        ClassTest的全部Annotation如下:
        @java.lang.Deprecated()
        该Class元素上的@SupportWanning注释为: null
        Class的所有内部类如下:
        class Chapter_3.ClassTest$Inner
        inClass对应类的外部类为:class Chapter_3.ClassTest
        inClass对应的外部类为class Chapter_3.ClassTest
        ClassTest对应的包为: package Chapter_3
        ClassTest对应的父类为class java.lang.Object*/
    

    这是我看李刚编著的《疯狂Java讲义》后总结出来的。

你可能感兴趣的:(java)