精华内容
下载资源
问答
  • 获取Class类四种方式:

    千次阅读 2018-01-25 23:25:42
    1.调用运行时本身的.class属性 Class clazz = Person.class;2.通过运行时的对象获取 Person p = new Person(); Class clazz = p.getClass(); 3.通过Class的静态方法获取:体现反射的动态性 Class clazz = ...

    1.调用运行时类本身的.class属性

    Class clazz = Person.class;
    2.通过运行时类的对象获取

    Person p = new Person();
    Class clazz = p.getClass();

    3.通过Class的静态方法获取:体现反射的动态性

    Class clazz = Class.forName("java.util.commons");
    4.通过类的加载器

    String className = "java.util.commons";
    ClassLoader cl = this.getClass().getClassLoader();
    Class clazz = cl.loaderClass(className);

    展开全文
  • 反射---获取Class类的4种方式

    万次阅读 2017-06-06 22:38:39
    随笔---------------------------------------获取Class类的4种方式----------------------------------------------------------------------------------------- 1.调用运行时本身的.class属性 Class clazz = ...

    随笔---------------------------------------获取Class类的4种方式-----------------------------------------------------------------------------------------


    1.调用运行时类本身的.class属性

    Class clazz = String.class;

    2,通过运行时类的对象获取

    Person p = new Person();

    Class clazz = p.getClass();

    3.通过Class的静态方法获取:体现反射的动态性

    String className = “java.util.commons”;

    Class clazz = Class.forName(className);

    4.通过类的加载器

    String className = “java.util.commons”;

    ClassLoader classLoader = this.getClass().getClassLoader();

    Class clazz = classLoader.loadClass(className);


    扩展:

    类加载起分为三种:系统类加载器:ClassLoader.getSystemClassLoader()

       扩展类加载器:ClassLoader.getSystemClassLoader().getParent()

      引导类加载器(核心库、对象----如String,Object):无法直接获取

    配置文件读取:如在包com.test.java下有配置文件jdbc.properties

        内容为:user = root           password=pd123

       类加载器加载(指定目录如:com.test.java):

       ClassLoader classLoader = this.getClass().getClassLoader();
       InputStream is = classLoader.getResourceAsStream("com/test/java/jdbc.properties");
         Properties properties = new Properties();
       properties.load(is);
       String user = properties.getProperty("user");
       System.out.println(user);

       文件字节输入流加载(根目录:src):
    //对比FileInputStream获取当前项目根目录下的文件
       FileInputStream is = new FileInputStream(new File("jdbc.properties"));

       Properties properties = new Properties();
       properties.load(is);
       String user = properties.getProperty("user");
       System.out.println(user);

    得到Class 后得到对应对象的实例--------------> class.newInstance() <------- 需要对应的对象有空参的构造器以及对应的调用构造器权限

    展开全文
  • 比如以下方式: ClassLoader.getSystemClassLoader().loadClass("com.my.test.Hello") 去看一下loadClass的源码: public Class<?> loadClass(String name) throws ClassNotFoundExceptio...

    1.通过ClassLoader对象的loadClass()方法

    比如以下方式:

      ClassLoader.getSystemClassLoader().loadClass("com.my.test.Hello")
    

    去看一下loadClass的源码:

    public Class<?> loadClass(String name) throws ClassNotFoundException {
            return loadClass(name, false);
        }
    

    最终调用:

    //可以看到参数resolve的解释,如果为true才会对这个类进行resolve
     /* @param  resolve
         *         If <tt>true</tt> then resolve the class
         * */
     protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            synchronized (getClassLoadingLock(name)) {
                // First, check if the class has already been loaded
                Class<?> c = findLoadedClass(name);
                if (c == null) {
                    long t0 = System.nanoTime();
                    try {
                        if (parent != null) {
                            c = parent.loadClass(name, false);
                        } else {
                            c = findBootstrapClassOrNull(name);
                        }
                    } catch (ClassNotFoundException e) {
                        // ClassNotFoundException thrown if class not found
                        // from the non-null parent class loader
                    }
    
                    if (c == null) {
                        // If still not found, then invoke findClass in order
                        // to find the class.
                        long t1 = System.nanoTime();
                        c = findClass(name);
    
                        // this is the defining class loader; record the stats
                        sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                        sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                        sun.misc.PerfCounter.getFindClasses().increment();
                    }
                }
                if (resolve) {
                    resolveClass(c);
                }
                return c;
            }
        }
    
    

    resolve其实是连接过程(验证verification,准备preparation,解析resolution),具体代码如下:

     /**
         * Links the specified class.  This (misleadingly named) method may be
         * used by a class loader to link a class.  If the class <tt>c</tt> has
         * already been linked, then this method simply returns. Otherwise, the
         * class is linked as described in the "Execution" chapter of
         * <cite>The Java&trade; Language Specification</cite>.
         *
         * @param  c
         *         The class to link
         *
         * @throws  NullPointerException
         *          If <tt>c</tt> is <tt>null</tt>.
         *
         * @see  #defineClass(String, byte[], int, int)
         */
        protected final void resolveClass(Class<?> c) {
            resolveClass0(c);
        }
    
        private native void resolveClass0(Class<?> c);
    

    可以看到,ClassLoader对象的loadClass()方法传入的resolve值为false,因此它不会对类进行连接这一过程,根据类的生命周期我们知道,如果一个类没有进行验证和准备的话,是无法进行初始化过程的,也就是说该方法的调用不会导致初始化<cinit>的执行。

    2. 类名.class

    Class a=Test.class
    

    该种方式同样不会对类进行初始化。

    3. Class.forName()

    Class test = Class.forName("com.my.Test");
    

    forName函数的源码如下:

     public static Class<?> forName(String className)
                    throws ClassNotFoundException {
            Class<?> caller = Reflection.getCallerClass();
            return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
        }
    
    

    forName0是一个native方法。调用forName(string)方法等同于调用Class.forName(className, true, currentLoader)方法。源码如下:

     public static Class<?> forName(String name, boolean initialize,
                                       ClassLoader loader)
            throws ClassNotFoundException
        {
            Class<?> caller = null;
            SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                // Reflective call to get caller class is only needed if a security manager
                // is present.  Avoid the overhead of making this call otherwise.
                caller = Reflection.getCallerClass();
                if (sun.misc.VM.isSystemDomainLoader(loader)) {
                    ClassLoader ccl = ClassLoader.getClassLoader(caller);
                    if (!sun.misc.VM.isSystemDomainLoader(ccl)) {
                        sm.checkPermission(
                            SecurityConstants.GET_CLASSLOADER_PERMISSION);
                    }
                }
            }
            return forName0(name, initialize, loader, caller);
        }
    

    initialize为true表示会进行初始化initialization步骤,即静态初始化(会初始化类变量,静态代码块)。

    这也就是为什么加载MySQL等一些数据库驱动程序的时候要使用这个方法的原因。比如MySQL的数据库驱动中有如下代码:

    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
    

    需要使用forName方式加载使得静态代码块得以初始化。

    4.object.getClass()

    这个方法没什么好说的了,你通过一个对象调用其getClass()方法能获得其对应类的Class对象,既然对象已经存在了,那么说明这个类已经被装载到了虚拟机中。

    public final native Class<?> getClass();
    
    展开全文
  • 获取Class对象的三种方式

    千次阅读 2018-05-17 12:42:09
    //综合最好的方法是第三方法/**法一:是通过对象来获取class的*法二:通过直接调class*法三:通过Class.forName();*/package hncu.reflect.getClass;import java.lang.reflect.Method;import org.junit.Test;...


    //综合最好的方法是第三种方法

    /*

    *法一:是通过类对象来获取class的

    *法二:通过类直接调class

    *法三:通过Class.forName();

    */

    package hncu.reflect.getClass;

    import java.lang.reflect.Method;
    import org.junit.Test;
    import hncu.Demo.Person;
    import hncu.Demo.Student;
    public class ReflectGetClass {
    @Test
    //法一:通过getClass的对象获取
    public void demo1(){
    Person p=new Person();
    Class c=p.getClass();
    //Method ms[]=c.getMethods();//该方式获得的方法包括其父类的public方法
    Method ms[]=c.getDeclaredMethods();//该方式获取不包括父类方法
    for(Method s:ms){
    System.out.println(s);
    System.out.println("------------------------");
    }
    }

    //任何数据的类型都包含一个静态属性class,通过他可以直接获取对应放入Class对象
    /**

    */
    @Test//法二:通过Class.forName()方法获取。这种方式仅需使用类名,就可以获取该类的Class对象,更有利于扩展。
    public void demo2(){
    // Class c=Person.class;
    Class c=Student.class;

    Method ms[]=c.getDeclaredMethods();//该方式获取不包括父类的方法
    for(Method s:ms){
    System.out.println(s);
    System.out.println("------------------------");
    }


    }

    @Test//法三:通过Class.forName()方法获取。
    public void demo3() throws Exception{
    String name=new String("hncu.Demo.Person");//此处的name必须是类全名即导的包的路径加上方法类名
    Class c=Class.forName(name);
    System.out.println(c);

    }


    }

    package hncu.Demo;


    public class Person {
    private String name;
    private int age;
    public Person(){

    }

    public Person(String name ,int age){
    this.name=name;
    this.age=age;
    }


    public String getName() {
    return name;
    }


    public void setName(String name) {
    this.name = name;
    }


    public int getAge() {
    return age;
    }


    public void setAge(int age) {
    this.age = age;
    }


    @Override
    public String toString() {
    return "name=" + name + ", age=" + age;
    }
    public  void bb(){
    System.out.println(3);
    }



    }



    展开全文
  • 种方式如何获取Class类

    千次阅读 2019-03-27 08:32:34
    种方式如何获取Class类 package com.test; public class Test1 { public static void main(String[] args) { //获取Class类 try { //1.Class.forName("com.test.Sub"); //Class c = Class.for...
  • Java反射----获取Class类实例的4种方式

    千次阅读 2019-03-21 17:11:51
    第一 调用运行时本身的.class属性 Class clazz=Person.class; //创建class对应的运行时Person对象 System.out.println(clazz); Class clazz1=String.class;...运行时的对象获取 Person p=new Per...
  • Java中的Class以及获取Class对象的三种方式 java.lang.Class 之前Hadoop里面job.setMapperClass(Map.class)之的方法用到了 xxx.class的写法,当时也没有深究。这两天又遇到了xxx.getClass()的写法,稍微...
  • Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个被加载后,系统会为该生成对应的 Class对象,通过 Class ...
  • 种获取Class类型的实例的方法

    万次阅读 2021-03-11 20:23:27
    通过Object中的getClass()方法; 通过静态方法Class.forName("全类名"); 通过字面常量Class.class
  • Class T - 由此 Class 对象建模的的类型。例如,String.class 的类型是 Class。如果将被建模的未知,则使用 Class。 public final class Class extends Object implements java.io.Serializable, ...
  • 获取Class对象的三方法

    千次阅读 2018-06-03 15:16:40
    1、调用Object的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如: MyObject x; Class c1 = x.getClass(); 2、使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如:...
  • 测试的两个: public class Father { private String sex; public String identity; } @RestController @RequestMapping("/") public class HelloController extends Father{ private String na...
  • 通过反射获取Class类型的三种方式

    万次阅读 2016-10-08 17:11:45
    一、通过反射获取类的三种方式 1、通过 Class.forName("的全称") 例如:Class cl1= Class.forName("com.csdn.Test"); 2、通过 类名.class 例如: Test test=new Test();  Class cl2=test.getClass();
  • 获取Class对象的三获取方式

    千次阅读 2015-06-20 13:23:58
    方法一:通过object中的getClass方法 // 虽然通用,但是前提是必须有指定,并对该进行对象的创建,才可以调用getclass方法。...方法三:使用Class类中的Forname方法,通过给定的类名来获取对应的字节码文
  • JAVA有三种方式可以获得Class对象 1、通过类名.class方式获得,Class cType = ClassName.class; public class Client { public static void main(String[] args) { Class cType1 = Test.class; } } class Test{ ...
  • Java反射 获取Class对象的三种方式

    千次阅读 2018-05-19 18:31:48
    获取一个对应的Class的方法1.使用Object.getClass ()方法----引用类型的对象的获取方式如果我们已经拿到了一个对象,可以使用这个对象...//使用已经存在的对象的getClass()方法获取Class对象 Class class1=str...
  • Java--反射机制原理、几种Class获取方式及应用场景

    万次阅读 多人点赞 2021-08-22 11:26:31
    1.1 反射原理1.2 举例说明二、Java反射机制中获取Class的三种方式及区别?2.1 三种方式及区别2.2 代码演示区别三、Java反射机制的应用场景有哪些?3.1 应用场景3.2 应用场景实现3.2.1 简单工厂模式3.2.2 简单工厂...
  • JAVA获取Class类型对象的3种方式

    万次阅读 2019-05-09 20:19:46
    class T{} public class Test{ public static void main...//第一种方式:java语言中任何一个java对象都有getClass()方法,getClass()返回运行 T e = new T(); Class c1 = e.getClass(); //第二种方式:ja...
  • [超级通道 : Java反射学习系列-绪论...获取Class对象的方式有三。 公有属性class 方法getClass() Class.forName() 下面是示例代码: /** * &lt;p&gt;Title: Java获取Class对象的三种方式&lt;/...
  • 注意:Class类获取类模板的实例对象,通过反射的机制获取。根据API中的定义,Class.getSimpleName( )方法是获取源代码中给出的”底层”的简称。而Class.getName( )是以String的形式,返回Class对象的”实体...
  • java中获取Class 的三方法

    千次阅读 2017-06-12 12:33:09
    Java中获取Class类的三方法: 1、Class.forName(“的路径”) 2、类名.Class 3、实例.getClass(); 1、Class.forName(“的路径”) 使用class的静态方法forName(),用的名字获取一个class实例...
  • (一)对反射的认识 反射:对对象的反向处理,通过对象获取对象的来源信息(即可以知道这个对象是通过什么类型实例化出来的)。 通过对象获取创建对象的...通过对象的getClass()方法获取Class对象。 2 通过类名...
  • 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查, 也称自审,并能直接操作程序的内部属性。例如,...
  • java反射(二):获取Class类四种方式

    千次阅读 2015-02-27 21:55:37
    编译(javac.exe),生成对应的.class文件,之后使用java.exe(JVM的加载器来完成)加载此.class文件,此.class文件加载到内存以后,就是一个运行时,存放在缓存区,这个运行时就是一个 Class的实例。 java.lang....
  • 获取Class字节码对象的三种方式

    万次阅读 2016-09-17 13:07:17
    在Java中获得Class对象通常有三种方式方式一,使用class属性: Class clz1 = java.util.Date.class; 方式二,通过Class类中的静态方法forName(String className),传入的全限定名(必须添加完整包名...
  • 获取Class类1、反射概述2、的加载过程3、获取Class类的三种方式3.1 通过 class.forname()来获取Class对象3.2 通过类名.class来获取Class对象3.3 通过对象的getClass()来获取Class对象3.4如果是一个基本数据类型,...
  • <!... , initial-scale=1.0"> <title></title> ... <div id='box' class="a b c">...通过getAttribute('class')即可获取,或者是获取dom节点的className属性 运行上面的代码就会看到控制台输出对应的类名 a b c

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,154,669
精华内容 1,261,867
关键字:

获取class类的四种方式