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