通过反射查看类信息 学习笔记

1、Java程序中有许多对象在运行时都会出现两种类型:编译时类型和运行时类型,如  p = new Student();  编译时类型为Person,运行时类型是Student

程序需要在运行时发现对象和类的真实信息,解决方法有两个:

① 假设知道编译时和运行时的类型信息,可以先使用 instanceof运算符进行判断,再利用强制类型转换将其转换成运行时类型变量即可。

②当编译时根本无法预知该对象和类 可能属于哪个类,程序只依靠运行时信息来发现该对象和类的真实信息,必须使用 反射

2、获得Class对象  三种方式

①使用Class类的forName(String clazzName)静态方法。 该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名)

②调用某个类的class属性来获取该类对应的Class对象。例如,Person.class将会返回Person类对应的Class对象。

③调用某个对象的getClass()方法。该方法是java.lang.Object类中的一个方法,所以所有的Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Clas对象。

3、从Class 中获取信息

package tju.chc.classtest;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

@Deprecated
@Annos(value = { @Anno,@Anno })
@Anno
public class ClassTest {
	@SuppressWarnings("unused")
	private ClassTest(){
		
	}
	public ClassTest(String[] args){
		
	}
	public void info(){
		System.out.println("执行无参数的info方法");
	}
	public void info(String str){
		System.out.println("执行有参的info方法" + ",其str参数值:" + str);
	}
	class Inner{
		
	}	
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException{
		Class<ClassTest> clazz = ClassTest.class;
		Constructor<?>[] ctors = clazz.getDeclaredConstructors();
		System.out.println("全部的构造函数如下");
		for(Constructor<?> a:ctors){
			System.out.println(a);
		}
		System.out.println("全部的公共构造函数如下");
		Constructor<?>[] publicCons = clazz.getConstructors();
		for(Constructor<?> p:publicCons){
			System.out.println(p);
		}
		System.out.println("全部fangfa ");
		Method[] mds = clazz.getMethods();
		for(Method md:mds){
			System.out.println(md);
		}
		System.out.println("带一个String参数的 info方法" + clazz.getMethod("info", String.class));
		
		Annotation[] anns = clazz.getAnnotations();
		System.out.println("全部的Annotations");
		for(Annotation an: anns){
			System.out.println(an);
		}
		System.out.println("获取内部类");
		Class<?>[] inners = clazz.getDeclaredClasses();
		for(Class<?> in:inners){
			System.out.println(in);
		}
		Class<?> inner = Class.forName("tju.chc.classtest.ClassTest$Inner");
		System.out.println("neibuleidui应的外部类:" + inner.getDeclaringClass());
		
		System.out.println("ClassTest的包为:" + clazz.getPackage());
		System.out.println("Inner的包为:" + inner.getPackage());
		System.out.println("ClassTest的父类为:" 
		+ clazz.getSuperclass()); 
	}
}


全部的构造函数如下
private tju.chc.classtest.ClassTest()
public tju.chc.classtest.ClassTest(java.lang.String[])
全部的公共构造函数如下
public tju.chc.classtest.ClassTest(java.lang.String[])
全部fangfa 
public static void tju.chc.classtest.ClassTest.main(java.lang.String[]) throws java.lang.NoSuchMethodException,java.lang.SecurityException,java.lang.ClassNotFoundException
public void tju.chc.classtest.ClassTest.info(java.lang.String)
public void tju.chc.classtest.ClassTest.info()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
带一个String参数的 info方法public void tju.chc.classtest.ClassTest.info(java.lang.String)
全部的Annotations
@tju.chc.classtest.Annos(value=[@tju.chc.classtest.Anno(), @tju.chc.classtest.Anno()])
@java.lang.Deprecated()
获取内部类
class tju.chc.classtest.ClassTest$Inner
neibuleidui应的外部类:class tju.chc.classtest.ClassTest
ClassTest的包为:package tju.chc.classtest
Inner的包为:package tju.chc.classtest
ClassTest的父类为:class java.lang.Object



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值