java反射获取类信息
2016-07-26 11:27
483 查看
(转载)http://www.cnblogs.com/zhuawang/archive/2012/12/09/2809895.html
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(String str) {
System.out.println("执行有参数的info方法" + ",其实str参数值:" + str);
}
// 定义一个测试用的内部类
class Inner {
}
public static void main(String[] args) throws Exception {
// 下面代码可以获取ClassTest对应的Class
Class<ClassTest> clazz = ClassTest.class;
// 获取该 Class 对象所对应类的全部构造器
Constructor[] ctors = clazz.getDeclaredConstructors();
System.out.println("ClassTest 的全部构造器如下:");
for (Constructor c : ctors) {
System.out.println(c);
}
// 获取该 Class 对象所对应类的全部 public 方法
Constructor[] publicCtors = clazz.getConstructors();
System.out.println("ClassTest 的全部 public 构造器如下 :");
for (Constructor c : publicCtors) {
System.out.println(c);
}
// 获取该 Class 对象所对应类的指定方法
Method[] mtds = clazz.getMethods();
System.out.println("ClassTest 的全部 public 方法如下:");
for (Method md : mtds) {
System.out.println(md);
}
// 获取该 Class 对象所对应类的指定方法
System.out.println("ClassTest 里带一个字符串参数的 info 方法为:"
+ clazz.getMethod("info", String.class));
//获取该 Class 对象所对应类的上的全部注释
Annotation[] anns=clazz.getAnnotations();
System.out.println("ClassTest 的全部 Annotattion 如下:");
for (Annotation an : anns) {
System.out.println(an);
}
System.out.println("该 Class 元素上的 @SuppressWarnings 注释为:"+
clazz.getAnnotation(SuppressWarnings.class));
<pre name="code" class="java">
//获取该 Class 对象所对应类的全部内部类 Class<?>[] inners=clazz.getDeclaredClasses(); System.out.println("ClassTest 的全部内部类如下:"); for (Class c : inners) { System.out.println(c); } //使用 Class.forName 方法加载 ClassTest 的 Inner 内部类 Class inClazz=Class.forName("ClassTest$Inner");
//通过getDeclaringClass()防伪该类所在的外部类 System.out.println("inClazz 对应类所在的外部类为:"+inClazz.getDeclaredClasses()); System.out.println("ClassTest 的包为:"+clazz.getPackage()); System.out.println("ClassTest 的父类为:"+clazz.getSuperclass()); } }
获取该Class对象所对应的类的全部内部类
获取该Class对象所对应的类的全部方法(不包括构造函数、不包括继承下来的方法、注意:包括重写的方法)
这里
System.out.println(clazz.getDeclaredMethods().length);输出为4。
如果将将study方法注释掉
// @Override
// public void study() {
// }输出为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() {
}
// 定义一个有参数的构造器
public ClassTest(String name) {
System.out.println("执行有参数的构造器");
}
// 定义一个无参数的info方法
public void info(String str) {
System.out.println("执行有参数的info方法" + ",其实str参数值:" + str);
}
// 定义一个测试用的内部类
class Inner {
}
public static void main(String[] args) throws Exception {
// 下面代码可以获取ClassTest对应的Class
Class<ClassTest> clazz = ClassTest.class;
// 获取该 Class 对象所对应类的全部构造器
Constructor[] ctors = clazz.getDeclaredConstructors();
System.out.println("ClassTest 的全部构造器如下:");
for (Constructor c : ctors) {
System.out.println(c);
}
// 获取该 Class 对象所对应类的全部 public 方法
Constructor[] publicCtors = clazz.getConstructors();
System.out.println("ClassTest 的全部 public 构造器如下 :");
for (Constructor c : publicCtors) {
System.out.println(c);
}
// 获取该 Class 对象所对应类的指定方法
Method[] mtds = clazz.getMethods();
System.out.println("ClassTest 的全部 public 方法如下:");
for (Method md : mtds) {
System.out.println(md);
}
// 获取该 Class 对象所对应类的指定方法
System.out.println("ClassTest 里带一个字符串参数的 info 方法为:"
+ clazz.getMethod("info", String.class));
//获取该 Class 对象所对应类的上的全部注释
Annotation[] anns=clazz.getAnnotations();
System.out.println("ClassTest 的全部 Annotattion 如下:");
for (Annotation an : anns) {
System.out.println(an);
}
System.out.println("该 Class 元素上的 @SuppressWarnings 注释为:"+
clazz.getAnnotation(SuppressWarnings.class));
<pre name="code" class="java">
//获取该 Class 对象所对应类的全部内部类 Class<?>[] inners=clazz.getDeclaredClasses(); System.out.println("ClassTest 的全部内部类如下:"); for (Class c : inners) { System.out.println(c); } //使用 Class.forName 方法加载 ClassTest 的 Inner 内部类 Class inClazz=Class.forName("ClassTest$Inner");
//通过getDeclaringClass()防伪该类所在的外部类 System.out.println("inClazz 对应类所在的外部类为:"+inClazz.getDeclaredClasses()); System.out.println("ClassTest 的包为:"+clazz.getPackage()); System.out.println("ClassTest 的父类为:"+clazz.getSuperclass()); } }
获取该Class对象所对应的类的全部内部类
clazz.getDeclaredClasses()
获取该Class对象所对应的类的全部方法(不包括构造函数、不包括继承下来的方法、注意:包括重写的方法)
clazz.getDeclaredFields()
interface Donothing { void study(); } class Ani { public void drink() { } } class StudentOne extends Ani implements Donothing{ public int age; public String name; public StudentOne() { } public StudentOne(int age, String name) { this.age = age; this.name = name; } public void now() { } private void feture() { } @Override public void study() { } @Override public void drink() { } }
这里
System.out.println(clazz.getDeclaredMethods().length);输出为4。
如果将将study方法注释掉
// @Override
// public void study() {
// }输出为3。
相关文章推荐
- Java反射详解
- Spring+quart
- java I/O模型
- 使用 iOS 8 Spring Animation API 创建动画
- eclipse导出的jar包不能运行
- JAVA中pdf转图片的方法
- RxJava实战演示1------基本代码使用
- 《Java源码分析》:WeakHashMap
- java文件的创建与删除
- Spring容器深入(li)
- Java之内部类与向上转型详解(附源码)
- maven update error:Cannot nest 'xxx/WEB-INF/classes' inside 'xxx'
- maven构建项目默认jdk版本修改
- 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
- Debug---Eclipse断点调试基础
- idea和eclipse 的debug调试快捷键对比
- 使用ant时 出现 java.lang.OutOfMemoryErro r: Java heap space的解决办法
- java变量,初始化快,构造函数的执行顺序
- Java开发中的23种设计模式之创建型模式
- java之数据库之Mysql及navicat的基本知识