现在的位置: 首页 > 综合 > 正文

java零碎要点—class()、getClass()、Class.forName()、getClassLoader()的区别和联系–又不详细的地方求补充

2019年09月16日 ⁄ 综合 ⁄ 共 4729字 ⁄ 字号 评论关闭

2.注意:.class()、getClass()、Class.forName()、getClassLoader()的区别和联系
  a.getClass(),是获取运行时的类:
    一个java.lang.Class对象代表了Java应用程序在运行时所加载的类或接口实例,也就是 

    说被加载的类在JVM中以Class的实例存在,Class对象由JVM自动产生。通过Object的    

    getClass()方法来获取每一个对象对应的Class对象,或的Class对象之后可以用Class对 

    象上的方法取得类的信息。
    例子:
     String name="john";
     //获得name对象的Class实例
      Class stringClass=name.getClass();
     //下面可以用stringClass实例获取name对象的相关信息,可以看API文档,这里只举两  

     // 个方法
     System.out.println("name对象的类型:"+stringClass.getName());
     System.out.println("name对象的父类:"+stringClass.getSuperclass().getName    

     ());
  b.Class.forName()是通过类名来获得类:
    在一些应用程序中,无法事先知道用户将加载什么类,而必须用户指定类名称以加载类  

    ,可以用Class的静态方法forName()方法实现动态加载类。
  c.getClassLoader()是获得类的加载器。
    例如String.class,代表的是调用字节码文件,来获取一个String的类型。
------------------------------------------------------------------------------
下面是一个完整的对getClass()和Class.forName()解释的例子,用到反射进行控制:
package com.credream.refelect;

import java.lang.reflect.*;

public class ClassDemo
{
 public static void main(String[] args) 
 {
  System.out.println("****************getClass()的例子*******************\n");
  String name="john";
  //获得name对象的Class实例
  Class stringClass=name.getClass();
  //下面可以用stringClass实例获取name对象的相关信息,可以看API文档,这里只举两个方


  System.out.println("name对象的类型:"+stringClass.getName());
  System.out.println("name对象的父类:"+stringClass.getSuperclass().getName());

/*结果:
 *   name对象的类型:java.lang.String
  name对象的父类:java.lang.Object*/

  System.out.println("\n****************forName()的例子*******************\n");
  //举forName()的例子
  //动态加载java.util.ArrayList类
  //得到类的Class实例后利用Class的方法取得类相关信息
  //里面有好多方法我就不解释了,你可以参考API文档
  try
  {
   Class c=Class.forName("java.util.ArrayList");
   int mod=c.getModifiers();//注意这里可以查看:Modifier类的源码,这里是给每一个修

饰符定义了一个int型的值;进行了转换
   System.out.println("-------------Modifier.toString(mod)----------");
   System.out.println(Modifier.toString(mod));
   System.out.println("-------------Modifier.toString(mod)----------");
   if(Modifier.isInterface(mod)){//判断是否是一个接口,如果是就打印出来
    System.out.print(" interface");
   }
    else{
    System.out.print(" class ");//
   System.out.println(c.getName()+"{");//java.util.ArrayList{

   System.out.println("\t//********成员变量**********");

   Field[] field=c.getDeclaredFields();//得到所有变量的数组
   for(Field f:field)
   {
  System.out.println("------------Modifier.toString(f.getModifiers

()------------");
    System.out.println("\t"+Modifier.toString(f.getModifiers()));//得到变量的修饰

符:private static final
    System.out.println("------------Modifier.toString(f.getModifiers

()------------");
    System.out.println("-----------f.getType().getName

()-----------------------");
    System.out.println(" "+f.getType().getName());//得到变量的类型名字: long
    System.out.println("-----------f.getType().getName

()-----------------------");
    System.out.println(" "+f.getName()+";");//得到变量的名字:serialVersionUID;
   }
   System.out.println("\t//********构造方法**********");

   Constructor[] constructor=c.getDeclaredConstructors();//
   for(Constructor con:constructor)
   {
    System.out.print("\t"+Modifier.toString(con.getModifiers()));//得到构造方法的

修饰符public
    System.out.println(" "+con.getName()+"();");//得到构造方法的名字

java.util.ArrayList();
   }
   System.out.println("\t//*********成员方法*************");
   Method[] method=c.getDeclaredMethods();
   for(Method mhd:method)
   {
    System.out.print("\t"+Modifier.toString((mhd.getModifiers())));//获得成员方法

的修饰符public 
    System.out.print(" "+mhd.getReturnType().getName());//获得成员方法的返回类

型;void
    System.out.println(" "+mhd.getName()+"()");//获得成员方法的name:add()
   }
   System.out.println("}");
  }
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  
 }
}
----------------------------------------------------------------------------
下面是:Modifier类的源码:
由于篇幅太长贴出部分代码:
----------------------------------------
  public static final int PUBLIC           = 0x00000001;
  public static final int PRIVATE          = 0x00000002;
--------------------------------------------------------
public static String toString(int mod) {
StringBuffer sb = new StringBuffer();
int len;

if ((mod & PUBLIC) != 0)
sb.append("public ");
if ((mod & PROTECTED) != 0)
sb.append("protected ");
if ((mod & PRIVATE) != 0)
sb.append("private ");

/* Canonical order */
if ((mod & ABSTRACT) != 0)
sb.append("abstract ");
if ((mod & STATIC) != 0)
sb.append("static ");
if ((mod & FINAL) != 0)
sb.append("final ");
if ((mod & TRANSIENT) != 0)
sb.append("transient ");
if ((mod & VOLATILE) != 0)
sb.append("volatile ");
if ((mod & SYNCHRONIZED) != 0)
sb.append("synchronized ");
if ((mod & NATIVE) != 0)
sb.append("native ");
if ((mod & STRICT) != 0)
sb.append("strictfp ");
if ((mod & INTERFACE) != 0)
sb.append("interface ");

if ((len = sb.length()) > 0)
/* trim trailing space */
   return sb.toString().substring(0, len-1);
return "";
    }
----------------------------------------------
 public static boolean isAbstract(int mod) {
return (mod & ABSTRACT) != 0;
    }
---------------------------------------------------
 public static boolean isInterface(int mod) {
return (mod & INTERFACE) != 0;
    }
----------------------------------------------------------------------
就先写这么多吧;有不对的地方希望大家指正;

抱歉!评论已关闭.