Java编程思想中Instanceof、getClass的区别以及反射部分
来源:互联网 发布:民间信贷数据 编辑:程序博客网 时间:2024/06/08 10:42
经过看书的困难,今天重新开始总结知识点:
1、Instanceof和getClass的区别
在是这样描述他们的区别的:instanceof保持着类型的概念,它指的是“你是这个类吗?”或者“你是这个类的派生类吗?”,而getClass得到的是确切的类型,并不考虑继承,它判断的是引用指向的对象的类型,与声明该变量的类型无关。
//测试代码如下:
import static net.mindview.util.Print.*;class Base{}class Derived extends Base{}public class FamilyVsExactType { static void test(Object x) { print("Tesing x of type " + x.getClass()); print("x instanceof Base " + (x instanceof Base)); print("x instanceof Derived " + (x instanceof Derived)); print("Base.isInstance(x) " + Base.class.isInstance(x)); print("Derived.isInstance(x) " + Derived.class.isInstance(x)); print("x.getClass() == Base.class " + (x.getClass()==Base.class)); print("x.getclass() == Derived.class " + (x.getClass() == Derived.class)); print("x.getclass().equals(Base.class) " + (x.getClass().equals(Base.class))); print("x.getclass().equals(Derived.class) " + (x.getClass().equals(Derived.class))); } public static void main(String[] args) { test(new Base()); test(new Derived()); }}
//测试结果:x instanceof Base truex instanceof Derived falseBase.isInstance(x) trueDerived.isInstance(x) falsex.getClass() == Base.class truex.getclass() == Derived.class falsex.getclass().equals(Base.class) truex.getclass().equals(Derived.class) falseTesing x of type class typeinfo.Derivedx instanceof Base truex instanceof Derived trueBase.isInstance(x) trueDerived.isInstance(x) truex.getClass() == Base.class falsex.getclass() == Derived.class truex.getclass().equals(Base.class) falsex.getclass().equals(Derived.class) true
2、初步接触反射
反射是指程序可以访问,检测甚至修改自身状态或者行为的一种机制。Class类和java.lang.reflect类库都对反射的概念进行了支持,这种类库包括了Field、Method以及Constructor类(每一个类都实现了Member接口),这些类型的对象是由JVM在运行时创建的。通常情况下不需要直接使用反射工具,但是当在需要创建动态代码时会很有用。根据编程思想的例子类方法提取器,可以稍微了解反射的优点:
//类方法提取器package typeinfo;import java.lang.reflect.*;import java.util.regex.*;import static net.mindview.util.Print.*;public class ShowMethods { private static String usage = "usage:\n" + "ShowMethods qualified.class.name\n" + "To show all methods in class or:\n" + "ShowMethods qualified .class.name word\n" + "To search for methods involving 'word'"; private static Pattern p = Pattern.compile("\\w+\\."); public static void main(String[] args) { if(args.length < 1) { print(usage); System.exit(0); } int lines = 0; try{ Class<?> c = Class.forName(args[0]); Method[] methods = c.getMethods(); Constructor[] ctors = c.getConstructors(); if(args.length == 1) { for(Method method : methods) { print( p.matcher(method.toString()).replaceAll("") ); } for(Constructor ctor : ctors) print(p.matcher(ctor.toString()).replaceAll("")); lines = methods.length + ctors.length; } else { for(Method method : methods) if(method.toString().indexOf(args[1]) != -1) { print(p.matcher(method.toString()).replaceAll("")); lines++; } for(Constructor ctor : ctors) if(ctor.toString().indexOf(args[1]) != -1) { print(p.matcher(ctor.toString()).replaceAll("")); lines++; } } } catch(ClassNotFoundException e) { print("No such class: " + e); } }}
//运行结果public static void main(String[])public final void wait() throws InterruptedExceptionpublic final void wait(long,int) throws InterruptedExceptionpublic final native void wait(long) throws InterruptedExceptionpublic boolean equals(Object)public String toString()public native int hashCode()public final native Class getClass()public final native void notify()public final native void notifyAll()public ShowMethods()
从运行结果可以看出,Class的getMethods()和getConstructors()方法分别反悔了Method对象的数组和Constructor对象的数组。其中Class.forName()的生成结果在编译是不可知的,因此所有的方法特征签名信息都是在执行时被提取出来的。
阅读全文
0 0
- Java编程思想中Instanceof、getClass的区别以及反射部分
- java instanceof和getClass()的区别
- java-----instanceof与getClass的区别
- JAVA中instanceof和getClass的应用
- java instanceof和getClass()的区别以及继承与组合的区别
- Rhyme/Java getClass()与instanceof的区别以及如何编写一个完美的equals()
- instanceof和getClass()的区别
- instanceof 与 getClass()的区别
- instanceof 和 getclass 的区别
- 反射中getClass()和class的区别
- (十一)instanceof 和 getclass 的区别
- java中 “==”和“equals”以及instanceof的区别
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- springMVC解决post、get中文乱码
- loongson2f龙芯灵珑9S2A一体机dd命令克隆硬盘方式备份系统
- 【卡特兰数】BZOJ1856(Scoi2010)[字符串]题解
- UVa-10820 Send a Table 欧拉函数
- 《深入理解Linux内核》软中断/tasklet/工作队列
- Java编程思想中Instanceof、getClass的区别以及反射部分
- MongoDB 用户与访问权限控制简介
- Android开发中Fragment的切换
- 怎么把notepad++添加的鼠标右键中
- C++ UNICODE ANSI 类型转换 常用函数
- iOS11导航栏在tabbar切换时动态隐藏
- 关于java多线程下单例模式的写法与理解
- oracle并发连接数修改
- Eclipse自动生成对象来接收方法的返回值的快捷键