0 0

Class类比较0

这样比较obj.getClass().getName()==String.class.getName()
和这样比较obj.getClass==String.class有什么区别吗?
一位牛人大叔说,要按照第二种方式来比较,具体的我也没很明白!
2012年9月28日 09:36

2个答案 按时间排序 按投票排序

1 0

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
0 0

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类 Java中的元数据Class类是一个基础的概念,它代理了这个类的类型信息、方法签名、属性等信息。每个类都有一个Class对象,它用来创建这个类的所有对象。每个对象的创建都依赖于Class对象的创建...

    Java中的CLASS类Java中的CLASS类

    System.out.println(c2.getName()); Class c3 = Point.class; System.out.println(c3.getName());...了解并熟练掌握Class类及其相关方法,对于理解和使用Java的高级特性,如动态代理、反射API等至关重要。

    Java中通过Class类获取Class对象的方法详解

    "Java中通过Class类获取Class对象的方法详解" Java中获取Class对象是Java基础知识中的一个重要部分,通过Class类可以获取Class对象,Class对象是Java虚拟机在加载类时自动构造的。下面将详细介绍通过Class类获取...

    JavaSE062Class类、Method类及Field类的使用方式深度探析.doc

    JavaSE062Class类、Method类及Field类的使用方式深度探析 JavaSE062Class类、Method类及Field类是Java中三个非常重要的类,它们都是Java反射机制的核心组件。在Java中,反射机制是指可以在运行时检查和修改类、方法...

    java .class 类反编译软件

    在这种需求下,出现了专门用于反编译Java字节码的工具,例如XJad,它是一个古老的类反编译器,可以将`.class`文件转换回`.java`源代码格式。 首先,我们需要理解Java的编译过程。当开发者编写完`.java`源代码后,会...

    Java中的Class类

    换言之,每当编写并且编译了一个新类,就会产生一个Class对象(恰当地说,是被保存在一个同名的.class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)首先检查这个类的Class对象...

    Xml文件自动生成C# Class类

    "Xml文件自动生成C# Class类"这个主题就涉及到了这一过程。这里我们将详细探讨如何实现这一功能,以及它在实际开发中的应用。 首先,XML文件是一种基于文本的数据存储格式,具有良好的可读性和结构化特性。它可以...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    class类反编译工具

    "类反编译工具"是一种专门用于将`class`文件转换回接近源代码形式的文本工具。它们可以揭示隐藏在二进制`class`文件中的方法、字段、常量池等信息,帮助开发者理解程序的工作原理,找出潜在的bug,或者分析第三方库...

    class类文件结构.xmind

    Java虚拟机中的class类文件的知识,个人整理大的class类文件结构.xmind,有什么问题及时反馈。

    Class详解内部类等

    在Java编程语言中,内部类(也称为嵌套类)是一种强大的工具,它可以提高代码的组织性和可读性。内部类可以直接访问外部类的所有成员,包括私有(private)成员,这使得它们在处理封装和实现特定逻辑时非常有用。...

    Java常用工具类UtilClass

    在Java编程中,工具类(Util Class)是包含各种实用函数的静态类,它们提供了一种简化常见任务的方法。在给定的`UtilClass`中,我们有五个主要的工具类:`StringUtil`、`FileUtil`、`ConnectDB`、`DateUtil`和`...

    class类查看工具

    "Class类查看工具"就是这样的一个实用工具,它允许我们查看、解析和理解Java字节码,从而更好地理解程序运行时的内部机制。这类工具对于调试、优化代码以及学习Java虚拟机(JVM)的工作原理非常有帮助。 在Java编程...

    java.lang.Class类

    Java.lang.Class类 Java.lang.Class类是Java语言中一个非常重要的类,它封装了对象和接口的运行时状态。当Java程序在运行时,Java虚拟机(JVM)会对所有对象进行类型标识,这项信息记录了每个对象所属的类。Class类...

    JarSearch,Java Class类所在的Jar包搜索器

    1、请首先输入需要查找的Java Class类,需要输入完整的Class类路径(包含包名), 例如: org.apache.log4j.Logger 2、选择需要查找的jar文件所在目录,例如: D:\log4j\lib 3、然后点击搜索按钮即可。

    ClassGraph-超快速超轻量级并行化的Java类路径扫描程序

    ClassGraph是一款强大的Java工具,专为开发者设计,用于执行高效、快速且并行的类路径扫描。这款开源库提供了一种灵活的方式,帮助开发者轻松地探索、分析和管理应用程序的类结构。它不仅适用于常规的类扫描任务,还...

    cg2_基类BaseClass派生出类_noddedc1c_

    定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和...

    Class类的使用

    NULL 博文链接:https://chaoyi.iteye.com/blog/2086871

    20年单类别(One-Class)分类全面综述论文

    本文提供了针对视觉识别的单类别分类OCC的经典统计和基于深度学习的最新方法的全面调研。...单类别分类(One-Class Classification,OCC)是多类别分类的一种特殊情况,其中训练期间观察到的数据来自单个阳性类。

    Allegro-Class(类)SubClass(子类)层功能介绍 .docx

    Allegro-Class(类)SubClass(子类)层功能介绍 Allegro-Class(类)SubClass(子类)层功能是 Allegro 工具中的一个重要概念,在 PCB 设计中扮演着关键角色。Class(类)代表设计中所有可见项目的类型,每个类中...

Global site tag (gtag.js) - Google Analytics