javatype对象转class对象_JAVA类型信息——Class对象(转载)

更新时间:2023-05-25 15:27:15 阅读: 评论:0

javatype对象转class对象_JAVA类型信息——Class对象(转
载)
JAVA类型信息——Class对象
⼀、RTTI概要
1、类型信息RTTI:即对象和类的信息,例如类的名字、继承的基类、实现的接⼝等。
2、类型信息的作⽤:程序员可以在程序运⾏时发现和使⽤类型信息。
3、RTTI真正含义:运⾏时,识别⼀个对象的类型。
4、如何在程序运⾏时识别对象和类的信息?
1)传统RTTI:即在编译时已知道了所有的类型。
2)反射机制:在程序运⾏时发现和使⽤类的信息。
5、RTTI的使⽤
大学英语四级听力
importjava.util.*;//List⽀持泛型
//import java.awt.List;不⽀持泛型
importjava.util.Arrays;
abstractclassShapes{
voiddraw() {System.out.println(this+".draw()");}
abstractpublicString toString();
}
classCircleextendsShapes{
publicString toString() {return"Circle";}
}
classTriangleextendsShapes{
publicString toString() {return"Triangle";}
}
classSquareextendsShapes{
publicString toString() {return"Square";}
}
classTest{
publicstaticList getList(){
List list_aShapes = Arrays.asList(newCircle() ,newSquare(),newTriangle());
returnlist_aShapes;
}
}
stickup
publicclassShape {
publicstaticvoidmain(String[] args) {
List list_aShapes = List();
for(Shapes ob_aShapes : list_aShapes) {
ob_aShapes.draw();
}
}
}
运⾏结果:Circle.draw()
Square.draw()
Triangle.draw()
结果分析:(1)toString()都继承Object类的toSting(),派⽣类的toString()都会覆盖基类的该⽅法。
(2)Shapes.draw()中的this间接调⽤toString()。
(3)假设Test类是服务器端提供给客户端使⽤的⼀个类,客户端调⽤该类的⽅法(这⾥main()调⽤)获得⼀个泛化引⽤,显然,客户端并不知道泛化引⽤中的确切类型,⽽程序员需要使⽤到某⼀个确切类型对象,这时,我们就需要到RTTI。在上⾯的例⼦中,我们只是打印出泛化引⽤的所有类型。
⼆、Class对象Class对象概述(1)持有RTTI信息
(2)每个类都有⼀个Class对象,每当编译⼀个新类就产⽣⼀个Class对象。
(3) Class引⽤总是指向某个Class对象。Class引⽤表⽰的就是它所指向的对象的确切类型,⽽该对象便是Class类的⼀个对象。
()
forName()(1)获取Class对象的⼀个引⽤,但引⽤的类还没有加载(该类的第⼀个对象没有⽣成)就加载了这个类.
(2)为了产⽣Class引⽤,forName()⽴即就进⾏了初始化。
Object-getClass()获取Class对象的⼀个引⽤,返回表⽰该对象的实际类型的Class引⽤。
getName()获取全限定的类名(包括包名),即类的完整名字。
联系方式翻译
getSimpleName()获取类名(不包括包名)
getCanonicalName()获取全限定的类名(包括包名)
isInterface()判断Class对象是否是表⽰⼀个接⼝
getInterface()返回Class对象,表⽰Class对象所引⽤的类所实现的所有接⼝。
getSupercalss()返回Class对象,表⽰Class对象所引⽤的类所继承的直接基类。应⽤该⽅法可在运⾏时发现⼀个对象完整的继承结构。
newInstance()返回⼀个Oject对象,是实现“虚拟构造器”的⼀种途径。
“虚拟构造器”:我不知道你的确切的类型,但⽆论如何都要正确创建你⾃⼰。
使⽤该⽅法创建的类,必须带有默认的构造器。
cast()接受⼀个对象为参数,并将其转型为Class引⽤的类型。该法⼀般是在⽆法使⽤普通转型的情况下使⽤。
getClassLoader()返回该类的类加载器。
getComponentType()返回表⽰数组组件类型的Class。
isArray()判定此Class对象是否表⽰⼀个数组类。
类字⾯常量(1)⼀种⽤来⽣成对Class对象引⽤的⽅法。
(2)相对forName()⽽⾔,效率更⾼,⽽且不会⽴即引发初始化。
(3)⽅法:className.class;。
在职研究生报考条件(4)既可⽤于普通类,也可⽤于接⼝、数组、基本数据类型。
…………等价于…………
boolean.classBoolean.class
ownerchar.classChar.class
byte.classByte.class
short.classShort.class
int.classInteger.class
long.classLong.class
float.classFloat.class
double.classDouble.class
void.classVoid.class
泛化的Class引⽤(1)实现⽅法:使⽤通配符“?”。
(2)Class>优于Class,即便他们是等价的。
(3)Class>的好处是明确地告诉编译器你选择了⾮具体的类版本,⽽不是由于碰巧或者疏忽⽽使⽤了⼀个⾮具体的类引⽤。
(4)创建⼀个范围:创建⼀个Class引⽤,使它被限定为某种类型;或该类型的任何⼦类型,< ? extends superClass>;或者该类型的超类,< ? super super sunClassName>
import java.lang.Class;
import flect.Constructor;
interface Iterface1{}
interface Iterface2{}
abstract class SuperClass{
SuperClass(){};
SuperClass(int i){}
static {System.out.println("creating SuperClass");}
}
class SunClass extends SuperClass implementsIterface1, Iterface2{
SunClass(){super(1);}
static {System.out.println("creating SunClass");}
}害怕的英文
class SunClass1 extends SuperClass implementsIterface1, Iterface2{
SunClass1(){super(1);}
static {System.out.println("creating SunClass1");} }
public class ClassObject {
static void printInfo(Class cc) {
System.out.println("Class name:" + cc.getName() + "is Interface : " + cc.isInterface()
+"Simple name : " + cc.getSimpleName()
+ "Canonical name : " + cc.getCanonicalName()); }
public static void main(String[] args) {
System.out.println("/forName()与类字⾯常量"); Class ob_aClass = null;
//对类的引⽤不引发初始化
Class ob_cClass = SuperClass.class;
System.out.println("After creating SuperClass"); try {
//⽴即初始化类
ob_aClass = Class.forName("rtti.SunClass"); System.out.println("After creating SunClass"); System.out.println("///");
}catch(ClassNotFoundException e){
System.out.println("Can't find SunClass."); it(1);
}
printInfo(ob_aClass);
System.out.println("///Class引⽤实现的接⼝///"); for(Class face : Interfaces()) printInfo(face);
System.out.println("//Class引⽤的基类");
Class ob_bClass = Superclass(); printInfo(ob_bClass);
System.out.println("///newInstance()///");
Object ob_aObject = null;
try {
ob_aObject = wInstance();
//运⾏剖出异常newInstance()该法必须由Class.forName()调⽤
//ob_aObject = wInstance();
}catch(InstantiationException e){
otagoSystem.out.println("Can't instante.");
色拉英语全集}catch(IllegalAccessException e){
System.out.println("Can't access.");美丽中国下载
2011中考物理
}
printInfo(Class());
System.out.println("//Class引⽤的泛型");
Class extends SuperClass>ob_dClass = SunClass.class;
printInfo(ob_dClass);
Class extends SuperClass>ob_eClass = SunClass1.class;
printInfo(ob_eClass);
/
/没有类型转换(Class super SunClass>),会出错,上位知道原因?
Class super SunClass>ob_fClass = (Class super SunClass>)
Superclass();
printInfo( ob_fClass);
}
}
运⾏结果:
creating SuperClass
creating SunClass
After creating SunClass
///
Class name:rtti.SunClassis Interface : falSimple name : SunClassCanonical name : rtti.SunClass
///Class引⽤实现的接⼝///
Class name:rtti.Iterface1is Interface : trueSimple name : Iterface1Canonical name : rtti.Iterface1
Class name:rtti.Iterface2is Interface : trueSimple name : Iterface2Canonical name : rtti.Iterface2
//Class引⽤的基类
Class name:rtti.SuperClassis Interface : falSimple name : SuperClassCanonical name : rtti.SuperClass

本文发布于:2023-05-25 15:27:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/122265.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   类型   客户端   继承
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图