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是一门静态 ...
随机推荐
- docker环境 mysql读写分离 mycat maxscale
#mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...
- EntityFramework Core 自动绑定模型映射
笔者最近在和同事共同开发项目时,需要从他们提供的包含数据库实体类型的类库中读取实体信息绑定到自己的项目中(但是都在同一个解决方案里),所以很直接的一种方式就是把项目中所有的实体都以 public Db ...
- springMVC源码分析--AbstractUrlHandlerMapping(三)
上一篇博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMapping了,接下来我们介绍其子类AbstractUrlHand ...
- ROS机器人程序设计(原书第2版)补充资料 (叁) 第三章 可视化和调试工具
ROS机器人程序设计(原书第2版)补充资料 (叁) 第三章 可视化和调试工具 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. ~$ rosl ...
- [tornado]使用webscoket的使用总是403错误
使用的tornado版本为4.0+ 后台: PS D:\CodeHouse\tornado\websocket> python .\ws_app.py WARNING:tornado.acces ...
- 自制DbHelper实现自动化数据库交互
之前一直对apache的DbUtils很好奇,也很佩服其中的设计上的智慧.于是就自己模拟实现了一个更加简便的小框架.我们只需要在配置文件中写上数据库层面的连接信息,就可以随心所欲的实现自己的需求了. ...
- Swift函数柯里化(Currying)简谈
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多 ...
- Servlet配置与资源参数
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // 继承HttpServlet 类 public cla ...
- EBS接口表关系概览(部分)
ItemTable Relationship TransactionTable Relationship PO/PRTable Relationships ReceivingTable Relatio ...
- C++对象模型的那些事儿之二:对象模型(下)
前言 上一篇博客C++对象模型的那些事儿之一为大家讲解了C++对象模型的一些基本知识,可是C++的继承,多态这些特性如何体现在对象模型上呢?单继承.多重继承和虚继承后内存布局上又有哪些变化呢?多态真正 ...