下面示范如果通过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 注释.

Java 反射之Class用法的更多相关文章

  1. Java反射的常见用法

    反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性方法等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的方法. 1 查看属性的修饰符.类型和名 ...

  2. java 反射与常用用法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...

  3. Java反射之Field用法

    在Java反射中Field用于获取某个类的属性或该属性的属性值 一:如何通过Field反射获取类的属性 Field提供如下几种方法: :1:Class.getDeclaredField(String ...

  4. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  5. 不藏了,这些Java反射用法总结都告诉你们

    摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...

  6. java反射-- Field 用法实践

    java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...

  7. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

  8. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  9. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

随机推荐

  1. 记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

  2. 为什么内部类访问的外部变量需要使用final修饰

    因为生命周期的原因.方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象.首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而 ...

  3. 没有JavaScript的基础,我可以学习Angular2吗?

    Can I learn and understand Angular2 without understanding JavaScript? 没有JavaScript基础我能学习和理解Angular2吗 ...

  4. Spring MVC 实践 - Base

    Spring MVC 实践 标签 : Java与Web Spring Web MVC Spring-Web-MVC是一种基于请求驱动的轻量级Web-MVC设计模式框架, Spring MVC使用MVC ...

  5. MT8127:如何让system分区可读写(MTK安卓6.0)

    Android 系统默认情况下,system 分区是只读 mount 的,因为无法进行往里写数据的,可 以用 adb 命令 adb remount 重新 mount 一下. 也可以通过在板子上,输入以 ...

  6. 好用的SQLAlchemy

    准备 安装SQLAlchemy框架 测试代码 知识点剖析 引入库支持 基类和引擎 实体类 声明类 数据库自动完成 CRUD 总结 这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过 ...

  7. PHP 针对多用户 实现头像更换

    成品图 思路 登陆页面 表单制作 验证码制作 JavaScript刷新验证码 验证页面 验证逻辑 页面跳转 header函数 Meta标签 JavaScript 上传页面 个人主页 上传核心 最终结果 ...

  8. 一道有趣的Twitter技术面试题

    来自:http://blog.jobbole.com/50705/ 看下面这个图片” “在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以表示为数组[2 ...

  9. sql server中高并发情况下 同时执行select和update语句死锁问题 (二)

    SQL Server死锁使我们经常遇到的问题,数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁.希望对您学习SQL Server死锁方面能有所帮助. 死锁对于DBA或是数据 ...

  10. 开源框架Slidingmenu的基本使用

    转载本博客请标明出处:点击打开链接      http://blog.csdn.net/qq_32059827/article/details/52464262 侧滑菜单在开发中经常用到,而Slidi ...