java中的反射一(Class类的认识)

Object类的支持

在Object类中定义了以下方法,此方法将被所有子类继承

public final Class getClass()

以上的方法返回值的类型是一个Class类,实际上此类事Java放射的源头,实际上所谓反射从程序的运行结果来看:可以通过对象反射求出类的名称

正常方式:

引用需要的包.类名称 ---> 通过new实例化----->取得实例化对象

反射方式:

实例化对象------> getClass()方法------------>得到完整的包.类名称

 

Class类

Class本身表示表示一个类的本身,通过Class可以完整的得到一个类中结构,包括此类中的方法定义,属性定义等。

 

方法摘要
<U> Class<? extends U>
asSubclass(Class<U> clazz)
          强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。
 Tcast(Object obj)
          将一个对象强制转换成此 Class 对象所表示的类或接口。
 booleandesiredAssertionStatus()
          如果要在调用此方法时,将要初始化该类,则返回将分配给该类的断言状态。
static Class<?>forName(String className)
          返回与带有给定字符串名的类或接口相关联的 Class 对象。
static Class<?>forName(String name, boolean initialize,ClassLoader loader)
          使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。
<A extends Annotation>
A
getAnnotation(Class<A> annotationClass)
          如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
 Annotation[]getAnnotations()
          返回此元素上存在的所有注释。
 StringgetCanonicalName()
          返回《Java Language Specification》中所定义的基础类的规范化名称。
 Class[]getClasses()
          返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口,包括从超类和公共类继承的以及通过该类声明的公共类和接口成员。
 ClassLoadergetClassLoader()
          返回该类的类加载器。
 Class<?>getComponentType()
          返回表示数组组件类型的 Class
 Constructor<T>getConstructor(Class... parameterTypes)
          返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
 Constructor[]getConstructors()
          返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
 Annotation[]getDeclaredAnnotations()
          返回直接存在于此元素上的所有注释。
 Class[]getDeclaredClasses()
          返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口,包括该类所声明的公共、保护、默认(包)访问及私有类和接口,但不包括继承的类和接口。
 Constructor<T>getDeclaredConstructor(Class... parameterTypes)
          返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
 Constructor[]getDeclaredConstructors()
          返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
 FieldgetDeclaredField(String name)
          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
 Field[]getDeclaredFields()
          返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
 MethodgetDeclaredMethod(String name,Class... parameterTypes)
          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
 Method[]getDeclaredMethods()
          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
 Class<?>getDeclaringClass()
          如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。
 Class<?>getEnclosingClass()
          返回基础类的立即封闭类。
 Constructor<?>getEnclosingConstructor()
          如果该 Class 对象表示构造方法中的一个本地或匿名类,则返回 Constructor 对象,它表示基础类的立即封闭构造方法。
 MethodgetEnclosingMethod()
          如果此 Class 对象表示某一方法中的一个本地或匿名类,则返回 Method 对象,它表示基础类的立即封闭方法。
 T[]getEnumConstants()
          如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。
 FieldgetField(String name)
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
 Field[]getFields()
          返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
 Type[]getGenericInterfaces()
          返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。
 TypegetGenericSuperclass()
          返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
 Class[]getInterfaces()
          确定此对象所表示的类或接口实现的接口。
 MethodgetMethod(String name,Class... parameterTypes)
          返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
 Method[]getMethods()
          返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法。
 intgetModifiers()
          返回此类或接口以整数编码的 Java 语言修饰符。
 StringgetName()
          以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
 PackagegetPackage()
          获取此类的包。
 ProtectionDomaingetProtectionDomain()
          返回该类的 ProtectionDomain
 URLgetResource(String name)
          查找带有给定名称的资源。
 InputStreamgetResourceAsStream(String name)
          查找具有给定名称的资源。
 Object[]getSigners()
          获取此类的标记。
 StringgetSimpleName()
          返回源代码中给出的基础类的简称。
 Class<? superT>getSuperclass()
          返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class
 TypeVariable<Class<T>>[]getTypeParameters()
          按声明顺序返回 TypeVariable 对象的一个数组,这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。
 booleanisAnnotation()
          如果此 Class 对象表示一个注释类型则返回 true。
 booleanisAnnotationPresent(Class<? extendsAnnotation> annotationClass)
          如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
 booleanisAnonymousClass()
          当且仅当基础类是匿名类时返回 true
 booleanisArray()
          判定此 Class 对象是否表示一个数组类。
 booleanisAssignableFrom(Class<?> cls)
          判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。
 booleanisEnum()
          当且仅当该类声明为源代码中的枚举时返回 true。
 booleanisInstance(Object obj)
          判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
 booleanisInterface()
          判定指定的 Class 对象是否表示一个接口。
 booleanisLocalClass()
          当且仅当基础类是本地类时返回 true
 booleanisMemberClass()
          当且仅当基础类是成员类时返回 true
 booleanisPrimitive()
          判定指定的 Class 对象是否表示一个基本类型。
 booleanisSynthetic()
          如果此类是复合类,则返回 true,否则 false
 TnewInstance()
          创建此 Class 对象所表示的类的一个新实例。
 StringtoString()
          将对象转换为字符串。
 

 

 实例化Class类对象

 实例化Class类对象的方法有三种:

  •  第一种:通过forName()方法

          Class<?> class = Class.forName(com.test.demo.Student);

  • 第二种:类.class

         Class<?>  class = Student.class;

  • 第三种:对象.getClass()

         Class<?>  class = new Student().getClass();

 

 

 Class类的作用

 Class主要是反射的源头,不仅可以取得对象所在类的信息,也可以直接通过Class类的方法进行对象的实例化操作。

正常情况下我们通过关键字new进行对象实例化,如果现在已经实例化好的Class对象,则可以通过Class类中提供的方法

public   T    newInstance()

来实例化某个对象。

 

注意:在Person中必须存在一个无参数的构造方法。

Class<?>  class = Class.forName(com.test.demo.Person);

Person   person = (Person)class.newInstance();

 上面的操作等价于:

Person   person = new  Person();

 

 以上的操作注意到问题:

1.在使用以上操作的时候读者一定要记住,被实例化对象的类中必须存在无参数构造方法,如果不存在的话,则是无法实例化的

2.对于以上程序,可以通过其他方式实例化操作,我们可以使用Constructor来实例化带参数的构造方法

 

 Constructor常用方法:

 

 intgetModifiers()
          以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。

 

 StringgetName()
          以字符串形式返回此构造方法的名称。

 Class<?>[]getParameterTypes()
          按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。
 
 TnewInstance(Object... initargs)
          使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

 

 Class<?> c = null ;  // 声明Class对象
  try{
   c = Class.forName("org.lxh.demo15.instancedemo.Person") ;
  }catch(ClassNotFoundException e){
   e.printStackTrace() ;
  }
  Person per = null ; // 声明Person对象
  Constructor<?> cons[] = null ;
  cons = c.getConstructors() ;
  try{
   per = (Person)cons[0].newInstance("fly",30) ; // 实例化对象
  }catch(Exception e){
   e.printStackTrace() ;
  }

 但是,从实际角度看,如果要使用反射进行对象的实例化操作,最好在类中存在无参数构造方法。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值