zoukankan      html  css  js  c++  java
  • Java 反射之Class用法

    下面示范如果通过Class对象获取对应类的信息:


    package com.reflect;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    //使用两个注释修饰的类
    
    
    @SuppressWarnings(value="unchecked")
    @Deprecated
    public class ClassTest {
    	
    	//该类定义一个私有的构造器
    	private ClassTest(){
    	}
    	
    	//定义一个有参数的构造器
    	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参数值:"+str);
    	}
    	//定义一个测试用的内部
    	class Inner{
    		
    	}
    	public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException {
    		//下面代码可以获取ClassTest对应的class
    		Class<ClassTest>  clazz=ClassTest.class;
    		//获取该Class对象所对应类的全部构造器
    		Constructor[] constructors=clazz.getDeclaredConstructors();
    		System.out.println("ClazzTest的全部构造器如下:");
    		for(Constructor constructor:constructors ){
    			System.out.println(constructor);
    		}
    		System.out.println("============================");
    		
    		
    		//获取该Class对象所对应类的全部public构造器
    		Constructor[] publicCtors=clazz.getConstructors();
    		System.out.println("ClazzTest的全部public构造器如下:");
    		for(Constructor constructor:publicCtors ){
    			System.out.println(constructor);
    		}
    		System.out.println("============================");
    		
    		
    		//获取该Class对象所对应的全部public 方法
    		Method[] mds=clazz.getMethods();
    		System.out.println("ClassTest的全部public方法如下:");
    		for(Method md:mds){
    			System.out.println(md);
    		}
    		System.out.println("============================");
    		
    		//获取该Class对象所对应的指定方法
    		System.out.println("ClassTest里带一个字符串参数的info方法为:"+clazz.getMethod("info", String.class));
    		System.out.println("============================");
            
    		
    		//获取该Class对象所对应类的上的全部注释
    		Annotation[] anns=clazz.getAnnotations();
    		System.out.println("ClassTest的全部Annotation如下:");
    		for(Annotation an:anns){
    			System.out.println(an);
    		}
    		
    		System.out.println("该Class元素上的@SuppressWarnings注释为:"+clazz.getAnnotation(SuppressWarnings.class));
    		System.out.println("============================");
    
    		//获取该Class对象所对应类的全部内部类
    		Class<?>[] inners=clazz.getDeclaredClasses();
    		System.out.println("ClassTest的全部内部类如下:");
    		for(Class c:inners){
    			System.out.println(c);
    		}
    		System.out.println("============================");
     
    		//使用Class.forName方法加载ClassTest的Inner内部类
    		Class inClazz=Class.forName("com.reflect.ClassTest$Inner");
    		//通过getDeclaringClasses()访问该类所在的外部类
    		System.out.println("inClazz所对应的外部类为:"+inClazz.getDeclaringClass());
    		
    		System.out.println("ClassTest的包为:"+clazz.getPackage());
    		System.out.println("ClassTest的父类为:"+clazz.getSuperclass());
    	}
    	
    
    
    }
    

    运行后结果如下:

    ClazzTest的全部构造器如下:
    private com.reflect.ClassTest()
    public com.reflect.ClassTest(java.lang.String)
    ============================
    ClazzTest的全部public构造器如下:
    public com.reflect.ClassTest(java.lang.String)
    ============================
    ClassTest的全部public方法如下:
    public void com.reflect.ClassTest.info(java.lang.String)
    public void com.reflect.ClassTest.info()
    public static void com.reflect.ClassTest.main(java.lang.String[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException,java.lang.ClassNotFoundException
    public final native java.lang.Class java.lang.Object.getClass()
    public native int java.lang.Object.hashCode()
    public boolean java.lang.Object.equals(java.lang.Object)
    public java.lang.String java.lang.Object.toString()
    public final native void java.lang.Object.notify()
    public final native void java.lang.Object.notifyAll()
    public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    public final void java.lang.Object.wait() throws java.lang.InterruptedException
    public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    ============================
    ClassTest里带一个字符串参数的info方法为:public void com.reflect.ClassTest.info(java.lang.String)
    ============================
    ClassTest的全部Annotation如下:
    @java.lang.Deprecated()
    该Class元素上的@SuppressWarnings注释为:null
    ============================
    ClassTest的全部内部类如下:
    class com.reflect.ClassTest$Inner
    ============================
    inClazz所对应的外部类为:class com.reflect.ClassTest
    ClassTest的包为:package com.reflect
    ClassTest的父类为:class java.lang.Object
    


    从运行结果可以看出,Class提供的功能非常丰富,它可以获得该类里包含的构造器、方法、内部类、注释等信息,也可以获取该类包含的属性(Field)信息----通过getFields()或 getFileds(String name)方法即可.

    注:对于只能在源代码上保留的注释,使用运行时获得的Class对象无法访问到该注释对象。如上面的@Suppress Warnings 注释.






  • 相关阅读:
    《Hadoop应用开发技术详解》
    c#中WMI 中的日期和时间转为本地时间
    c# 获取某个进程的CPU使用百分百(类似任务管理器中显示CPU)
    获得特定进程信息
    javascript利用jquery-1.7.1来判断是否是谷歌Chrome浏览器
    Oracle 用Drapper进行like模糊传参查询需要在参数值前后带%符合
    IIS7.0部署MVC/WebApi项目,报404.4错误
    MVC+EF6+Oracle,提示ORA-01918: user '***' does not exist
    MongoDB查询转对象是出错Element '_id' does not match any field or property of class
    MongoDB 导出、导入表
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300340.html
Copyright © 2011-2022 走看看