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 注释.
Java 反射之Class用法的更多相关文章
- Java反射的常见用法
反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性方法等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的方法. 1 查看属性的修饰符.类型和名 ...
- java 反射与常用用法
java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...
- Java反射之Field用法
在Java反射中Field用于获取某个类的属性或该属性的属性值 一:如何通过Field反射获取类的属性 Field提供如下几种方法: :1:Class.getDeclaredField(String ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
- java反射-- Field 用法实践
java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
- java反射机制 + Method.invoke解释 getMethod + 反射理解
功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...
- Java反射机制深度剖析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...
随机推荐
- 实验与作业(Python)-文件操作
1.CSV文件的处理 下载-身份证号文件 导入: 读入"身份证号.txt",然后打印出来.注意:是否多打了一行,为什么? 读入"身份证号.txt",然后存储到& ...
- Git之(一)Git是什么
为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...
- 手动创建第一个OC程序
手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...
- springMVC源码分析--HandlerMapping(一)
HandlerMapping的工作就是为每个请求找到合适的请求找到一个处理器handler,其实现机制简单来说就是维持了一个url到Controller关系的Map结构,其提供的实际功能也是根据req ...
- 【完整的App项目】颖火虫笔记
这是本人花大概一个星期开发出来的一款App,这是一款类似印象笔记的App,随时记录您的生活点滴.首先说一下自己为何要开发这款App,因为自己手机系统自带的笔记应用功能太low,界面不够漂亮,所以自己就 ...
- 协议系列之UDP协议
上节说的TCP协议虽然提供了可靠的传输,但是也有一个缺点,发送速度慢.那么有没有一种协议能快速发送的呢?这节要讨论的就是UDP协议,它提供了更加快的发送速度,但也牺牲了可靠性,它是一种无连接的传输协议 ...
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...
- jvm java虚拟机 新生代的配置
1.1.1.1. -Xmn参数 参数-Xmn1m可以用于设置新生代的大小.设置一个较大的新生代会影响老生代的大小,因为这两者的总和是一定的,这个系统参数对于系统性能以及GC行为有很大的影响,新生代一般 ...
- 什么时候App委托会收到App进程被结束的消息
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在Xcode建立的新项目后,在AppDelegate类会发 ...
- iOS7 CookBook精彩瞬间(一)property、selector细节、__unused
1.我们常常使用nonatomic,很多人只知道它的效率较高,却不知道其含义,其含义是非线程安全的,也就是说多线程修改时不加锁,可能出现多个线程先后修改而成为脏数据的情况. 2.unsafe_unre ...