java基础 学习笔记(二):常用类 —— class类

Class类

简介

我们可以通过class类来获取class对象。class类仅有一个私有的构造方法 private Class(ClassLoader loader)。
class对象指的是运行时java应用中类(class、enum)或接口(interface、annotation)。所有元素类型和大小相同的数组都会是同一个class对象。基本类型boolean,byte,char,short,int,long,float,double和关键字void同样表现为class对象。

public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type,AnnotatedElement{
	private Class(ClassLoader loader) {
        classLoader = loader;
    }
...
}

public interface Serializable {
}

public interface GenericDeclaration extends AnnotatedElement {
    public TypeVariable<?>[] getTypeParameters();
}

public interface Type {
   default String getTypeName() {
        return toString();
    }
}

public interface AnnotatedElement {...}

使用

1、获取class对象

//默认初始化
public static Class<?> forName(String className) throws ClassNotFoundException {...}
//initialize为true,class类初始化;initialize为false,class类不初始化
public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException {...}
package month1.classLoaderTest;
public class Init {
    static {
        System.out.println("Init 执行static块");
    }
    static int A = 100;
    public String name;
    protected int age;
    char sex;
    private String phoneNum;
    Init() {
        System.out.println("Init 实例构造器");
    }
    Init() {
        System.out.println("Init 实例构造器");
    }
    public void show1(String s){
        System.out.println("调用了:公有的,String参数的show1(): s = " + s);
    }
    protected void show2(){
        System.out.println("调用了:受保护的,无参的show2()");
    }
    void show3(){
        System.out.println("调用了:默认的,无参的show3()");
    }
    private String show4(int age){
        System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
        return "abcd";
    }
    @Override public String toString() {
        return "VAST [name=" + name + ",age=" + age + ",sex=" + sex + ", phoneNum=" + phoneNum +"]";
    }
}
package month1.classLoaderTest;
public class Init1 {
    public static void main(String[] args) throws Exception{
    Class clazz = Class.forName("month1.classLoaderTest.Init"); //执行类的初始化,打印出“Init 执行static块”
    Class clazz1 = Class.forName("month1.classLoaderTest.Init", false, Init.class.getClassLoader());//没有打印结果
    new ClassLoader(){}.loadClass("month1.classLoaderTest.Init");//没有打印结果
    System.out.println(Init.A);//执行类的初始化,打印出“Init 执行static块”
    }
 }

2、通过class对象获取构造函数

		System.out.println("*******************所有公有构造方法********************");
        Constructor[] conArray = clazz.getConstructors();
        for (Constructor c : conArray) {
            System.out.println(c);
        }

        System.out.println("*******************所有的构造方法(包括:私有,受保护,默认,公有)********************");
        conArray = clazz.getDeclaredConstructors();
        for (Constructor c : conArray) {
            System.out.println(c);
        }
        System.out.println("新建实例");
        Init init1 = new Init();
        Init init2 = new Init("qdm");
        //结果
        *******************所有公有构造方法********************
		public month1.classLoaderTest.Init(java.lang.String,int)
		*******************所有的构造方法(包括:私有,受保护,默认,公有)********************
		public month1.classLoaderTest.Init(java.lang.String,int)
		month1.classLoaderTest.Init(java.lang.String)
		month1.classLoaderTest.Init()
		新建实例
		Init 实例构造器
		携带String类型参数 构造器

3、获取成员变量并访问成员

		System.out.println("*****************获取所有的公有字段*****************");
        Field[] fields = clazz.getFields();
        for (Field f : fields) {
            System.out.println(f);
        }
        System.out.println("*****************获取所有字段(包括私有,受保护,默认)*****************");
        fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f);
        }
        System.out.println("*****************获取公有字段并调用*****************");
        Field f = clazz.getField("name");
        System.out.println(f);
        Object obj = clazz.getDeclaredConstructor().newInstance();
        f.set(obj, "刘德华");
        System.out.println("验证姓名: " + ((Init)obj).name);

        System.out.println("*****************获取私有字段并调用*****************");
        f = clazz.getDeclaredField("phoneNum");
        System.out.println(f);
        f.setAccessible(true);
        f.set(obj, "18352534196");
        System.out.println("验证电话: " + (Init)obj);
        
        //结果
        *****************获取所有的公有字段*****************
		public java.lang.String month1.classLoaderTest.Init.name
		*****************获取所有字段(包括私有,受保护,默认)*****************
		static int month1.classLoaderTest.Init.A
		public java.lang.String month1.classLoaderTest.Init.name
		protected int month1.classLoaderTest.Init.age
		char month1.classLoaderTest.Init.sex
		private java.lang.String month1.classLoaderTest.Init.phoneNum
		*****************获取公有字段并调用*****************
		public java.lang.String month1.classLoaderTest.Init.name
		Init 执行static块
		Init 实例构造器
		验证姓名: 刘德华
		*****************获取私有字段并调用*****************
		private java.lang.String month1.classLoaderTest.Init.phoneNum
		验证电话: VAST [name=刘德华,age=0,sex= , phoneNum=18352534196]

4、获取方法并调用

		System.out.println("****************获取所有的'公有'方法*******************");
        Method[] methods = clazz.getMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
        System.out.println("****************获取所有的方法,包括私有的*******************");
        methods = clazz.getDeclaredMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
        System.out.println("****************获取公有的show1()方法*******************");
        Method m = clazz.getMethod("show1", String.class);
        System.out.println(m);
        Object obj = clazz.getDeclaredConstructor().newInstance();
        m.invoke(obj, "刘德华");

        System.out.println("****************获取私有的show4()方法*******************");
        m = clazz.getDeclaredMethod("show4", int.class);
        System.out.println(m);
        m.setAccessible(true);
        Object result = m.invoke(obj, 20);
        System.out.println("返回值: " + result);

		//结果
		****************获取所有的'公有'方法*******************
		public void month1.classLoaderTest.Init.show1(java.lang.String)
		public java.lang.String month1.classLoaderTest.Init.toString()
		public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
		public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
		public final void java.lang.Object.wait() throws java.lang.InterruptedException
		public boolean java.lang.Object.equals(java.lang.Object)
		public native int java.lang.Object.hashCode()
		public final native java.lang.Class java.lang.Object.getClass()
		public final native void java.lang.Object.notify()
		public final native void java.lang.Object.notifyAll()
		****************获取所有的方法,包括私有的*******************
		protected void month1.classLoaderTest.Init.show2()
		void month1.classLoaderTest.Init.show3()
		public void month1.classLoaderTest.Init.show1(java.lang.String)
		private java.lang.String month1.classLoaderTest.Init.show4(int)
		public java.lang.String month1.classLoaderTest.Init.toString()
		****************获取公有的show1()方法*******************
		public void month1.classLoaderTest.Init.show1(java.lang.String)
		Init 执行static块
		Init 实例构造器
		调用了:公有的,String参数的show1(): s = 刘德华
		****************获取私有的show4()方法*******************
		private java.lang.String month1.classLoaderTest.Init.show4(int)
		调用了,私有的,并且有返回值的,int参数的show4(): age = 20
		返回值: abcd

猜你喜欢

转载自blog.csdn.net/qq_28376741/article/details/88549631