-
Class类比较0
这样比较obj.getClass().getName()==String.class.getName()
和这样比较obj.getClass==String.class有什么区别吗?
一位牛人大叔说,要按照第二种方式来比较,具体的我也没很明白!
2012年9月28日 09:36
2个答案 按时间排序 按投票排序
-
1、一个classloader加载这两个比较是没有问题
2、多classloader A加载obj B加载ABC.class 则
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Object o = new MyClassLoader("F:/javass/spring/workspace/spring2test/bin").findClass("cn.A").newInstance();
System.out.println(o.getClass().getClassLoader());
System.out.println(A.class.getClassLoader());
System.out.println(o.getClass().getName() == A.class.getName()); //true
System.out.println(o.getClass() == A.class); //false
}
多classloader时 name相同 但class不同(不同的classloader加载的相同类是不相等的)package cn; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; public class ClassLoaderTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Object o = new MyClassLoader("F:/javass/spring/workspace/spring2test/bin").findClass("cn.A").newInstance(); System.out.println(o.getClass().getClassLoader()); System.out.println(A.class.getClassLoader()); System.out.println(o.getClass().getName() == A.class.getName()); System.out.println(o.getClass() == A.class); } } class MyClassLoader extends ClassLoader { private String fileName; public MyClassLoader(String fileName) { this.fileName = fileName; } protected Class<?> findClass(String className) throws ClassNotFoundException { Class clazz = null;//this.findLoadedClass(className); if (null == null) { try { String classFile = getClassFile(className); FileInputStream fis = new FileInputStream(classFile); FileChannel fileC = fis.getChannel(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); WritableByteChannel outC = Channels.newChannel(baos); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); while (true) { int i = fileC.read(buffer); if (i == 0 || i == -1) { break; } buffer.flip(); outC.write(buffer); buffer.clear(); } fis.close(); byte[] bytes = baos.toByteArray(); clazz = defineClass(className, bytes, 0, bytes.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return clazz; } private byte[] loadClassBytes(String className) throws ClassNotFoundException { try { String classFile = getClassFile(className); FileInputStream fis = new FileInputStream(classFile); FileChannel fileC = fis.getChannel(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); WritableByteChannel outC = Channels.newChannel(baos); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); while (true) { int i = fileC.read(buffer); if (i == 0 || i == -1) { break; } buffer.flip(); outC.write(buffer); buffer.clear(); } fis.close(); return baos.toByteArray(); } catch (IOException fnfe) { throw new ClassNotFoundException(className); } } private String getClassFile(String name) { StringBuffer sb = new StringBuffer(fileName); name = name.replace('.', File.separatorChar) + ".class"; sb.append(File.separator + name); return sb.toString(); } }
2012年9月28日 12:18
-
obj.getClass().getName()==String.class.getName()
和这样比较obj.getClass==String.class
先不说那个个牛人对错。先看代码:
========BaseDemo======package com; public class BaseDemo { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
========ExtendDemo======public class ExtendDemo extends BaseDemo { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { BaseDemo baseclass1 = new ExtendDemo(); BaseDemo baseclass2 = new BaseDemo(); System.out.println(baseclass1.getClass().getName());// 实际运行的是继承类ExtendDemo System.out.println(baseclass2.getClass().getName());// 实际运行的是BaseDemo System.out.println(BaseDemo.class.getName()); System.out.println(ExtendDemo.class.getName()); System.out.println("Class "+baseclass1.getClass()); System.out.println("Class "+baseclass2.getClass()); } }
运行结果:
com.ExtendDemo
com.BaseDemo
com.BaseDemo
com.ExtendDemo
Class class com.ExtendDemo
Class class com.BaseDemo
先说:obj.getClass() 和 String.class
obj.getClass() 这个obj是看 new XXXX()类的路径的类 例如上面:
BaseDemo baseclass1 = new ExtendDemo();
BaseDemo baseclass2 = new BaseDemo();
System.out.println(baseclass1.getClass().getName());// 实际运行的是继承类ExtendDemo
System.out.println(baseclass2.getClass().getName());// 实际运行的是BaseDemo
而 String.class 这个就获取当前类的路径 也就是String类所在是包路径 java.lang.String
还有这个方法返回的是字符串。那么字符串是不能用==号来比较值的相等的
至于:obj.getClass==String.class
obj.getClass() 这个obj是看 new XXXX()类的路径的类
而String.class 直接是 Class java.lang.String
如果obj=new String(); 那么 obj.getClass()返回的也是 Class class java.lang.String
综上所述:
结论:在特定情况下:obj.getClass().getName()==String.class.getName() //返回true
obj.getClass==String.class 返回也是true
例如:
String s1=new String("111");
System.out.println((s1.getClass().getName()==String.class.getName()));//返回true
System.out.println((s1.getClass()==String.class));//返回true
希望能明白
2012年9月28日 11:01
相关推荐
Java元数据——Class类 Java中的元数据Class类是一个基础的概念,它代理了这个类的类型信息、方法签名、属性等信息。每个类都有一个Class对象,它用来创建这个类的所有对象。每个对象的创建都依赖于Class对象的创建...
System.out.println(c2.getName()); Class c3 = Point.class; System.out.println(c3.getName());...了解并熟练掌握Class类及其相关方法,对于理解和使用Java的高级特性,如动态代理、反射API等至关重要。
"Java中通过Class类获取Class对象的方法详解" Java中获取Class对象是Java基础知识中的一个重要部分,通过Class类可以获取Class对象,Class对象是Java虚拟机在加载类时自动构造的。下面将详细介绍通过Class类获取...
JavaSE062Class类、Method类及Field类的使用方式深度探析 JavaSE062Class类、Method类及Field类是Java中三个非常重要的类,它们都是Java反射机制的核心组件。在Java中,反射机制是指可以在运行时检查和修改类、方法...
在这种需求下,出现了专门用于反编译Java字节码的工具,例如XJad,它是一个古老的类反编译器,可以将`.class`文件转换回`.java`源代码格式。 首先,我们需要理解Java的编译过程。当开发者编写完`.java`源代码后,会...
换言之,每当编写并且编译了一个新类,就会产生一个Class对象(恰当地说,是被保存在一个同名的.class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)首先检查这个类的Class对象...
"Xml文件自动生成C# Class类"这个主题就涉及到了这一过程。这里我们将详细探讨如何实现这一功能,以及它在实际开发中的应用。 首先,XML文件是一种基于文本的数据存储格式,具有良好的可读性和结构化特性。它可以...
### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...
"类反编译工具"是一种专门用于将`class`文件转换回接近源代码形式的文本工具。它们可以揭示隐藏在二进制`class`文件中的方法、字段、常量池等信息,帮助开发者理解程序的工作原理,找出潜在的bug,或者分析第三方库...
Java虚拟机中的class类文件的知识,个人整理大的class类文件结构.xmind,有什么问题及时反馈。
在Java编程语言中,内部类(也称为嵌套类)是一种强大的工具,它可以提高代码的组织性和可读性。内部类可以直接访问外部类的所有成员,包括私有(private)成员,这使得它们在处理封装和实现特定逻辑时非常有用。...
在Java编程中,工具类(Util Class)是包含各种实用函数的静态类,它们提供了一种简化常见任务的方法。在给定的`UtilClass`中,我们有五个主要的工具类:`StringUtil`、`FileUtil`、`ConnectDB`、`DateUtil`和`...
"Class类查看工具"就是这样的一个实用工具,它允许我们查看、解析和理解Java字节码,从而更好地理解程序运行时的内部机制。这类工具对于调试、优化代码以及学习Java虚拟机(JVM)的工作原理非常有帮助。 在Java编程...
Java.lang.Class类 Java.lang.Class类是Java语言中一个非常重要的类,它封装了对象和接口的运行时状态。当Java程序在运行时,Java虚拟机(JVM)会对所有对象进行类型标识,这项信息记录了每个对象所属的类。Class类...
1、请首先输入需要查找的Java Class类,需要输入完整的Class类路径(包含包名), 例如: org.apache.log4j.Logger 2、选择需要查找的jar文件所在目录,例如: D:\log4j\lib 3、然后点击搜索按钮即可。
ClassGraph是一款强大的Java工具,专为开发者设计,用于执行高效、快速且并行的类路径扫描。这款开源库提供了一种灵活的方式,帮助开发者轻松地探索、分析和管理应用程序的类结构。它不仅适用于常规的类扫描任务,还...
定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和...
NULL 博文链接:https://chaoyi.iteye.com/blog/2086871
本文提供了针对视觉识别的单类别分类OCC的经典统计和基于深度学习的最新方法的全面调研。...单类别分类(One-Class Classification,OCC)是多类别分类的一种特殊情况,其中训练期间观察到的数据来自单个阳性类。
Allegro-Class(类)SubClass(子类)层功能介绍 Allegro-Class(类)SubClass(子类)层功能是 Allegro 工具中的一个重要概念,在 PCB 设计中扮演着关键角色。Class(类)代表设计中所有可见项目的类型,每个类中...