Java面试基础—Class类中各个方法有什么区别?

一、获取Class对象的三种方式

package com.reflect;
public class Demo3 {
	public static void main(String[] args) {
		// 第一种方式获取Class对象
		User u1 = new User();// 这一new 产生一个Student对象,一个Class对象。
		Class u1Class = u1.getClass();// 获取Class对象
		System.out.println("class "+u1Class.getName());

		// 第二种方式获取Class对象
		Class u2 = User.class;
		System.out.println(u2);

		// 第三种方式获取Class对象
		try {
			Class u3 = Class.forName("com.reflect.User");// 注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			//判断三种方式,获取结果是否一致
			System.out.println(u2 == u1Class);// 判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
			System.out.println(u3 == u1Class);// 判断三种方式是否获取的是同一个Class对象
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
        
	}
}

执行结果,得出结论:
同一个字节码文件(*.class)在同一次程序运行过程中,只会被加载一次!
无论何种方式获取class文件对象,都是同一个!

在这里插入图片描述

二、Class类中各个方法

Person类

package com.reflect;
public class Person {
    public String name;     //最大范围public
    protected  int age;     //受保护类型
    int height;             //默认的访问权限
    private String adress;  //私有类型
    public Person() {
    }
    protected Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    Person(String name, int age, int height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }
    private Person(String name, int age, int height, String adress) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.adress = adress;
    }
    public void eat(){
        System.out.println("eat...");
    }
    protected void drink(){
        System.out.println("drink...");
    }
    void play(){
        System.out.println("play...");
    }
    private void happy(){
        System.out.println("happy...");
    }
}

User继承Person类

package com.reflect;
public class User extends Person{
	    public String username;      //最大范围public
	    protected  String userage;   //受保护类型
	    String users;                //默认的访问权限
	    private String userid;       //私有类型
	    public User() {
	    }
	    protected User(String userage) {
	        this.userage = userage;
	    }
	    User(String username, String userid) {
	        this.username = username;
	        this.userid = userid;
	    }
	    private User(String username, String userage, String users, String userid) {
	        this.username = username;
	        this.userage = userage;
	        this.users = users;
	        this.userid = userid;
	    }
	    public void haha(){
	        System.out.println("哈哈哈...");
	    }
	    protected void xixi(){
	        System.out.println("嘻嘻嘻...");
	    }
	    void wu(){
	        System.out.println("呜呜呜...");
	    }
	    private void liu(){
	        System.out.println("溜溜溜...");
	    } 	
}

Demo3测试

package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo3 {
	public static void main(String[] args) {
		// 第一种方式获取Class对象
		User u1 = new User();// 这一new 产生一个Student对象,一个Class对象。
		Class u1Class = u1.getClass();// 获取Class对象
		//System.out.println("class "+u1Class.getName());
		System.out.println("*************getFields方法***********");
		//使用getFields()方法获取成员变量,会获取所有public修饰的成员变量,包括父类。
        Field[] fields = u1Class.getFields();
        for(Field field : fields){
            System.out.println(field);
        }
        System.out.println("*************getDeclaredFields方法***********");
        //getDeclaredFields()方法会获取本类中所有的成员变量,不考虑修饰符,不包括父类。
        Field[] fields2  = u1Class.getDeclaredFields();
        for (Field field : fields2) {
        	 System.out.println(field);
		}
        //System.out.println("*************getConstructors方法***********");
        //使用getConstructors()方法获取构造函数,获取本类中所有public修饰的构造函数,不包括父类。
        Constructor[] constructors = u1Class.getConstructors();
        for(Constructor constructor : constructors){
            //System.out.println(constructor);
        }
        //System.out.println("*************getDeclaredConstructors方法***********");
        //getDeclaredConstructors()方法会获取本类中所有的构造函数,不考虑修饰符,不包括父类。
        Constructor[] constructors1 = u1Class.getDeclaredConstructors();
        for(Constructor const1 : constructors1){
            //System.out.println(const1);
        }
        
        //System.out.println("************getMethods方法************");
	    //使用getMethods()方法获取成员方法,获取所有public修饰的成员方法,包括父类和超类。
        Method[] methods=u1Class.getMethods();
        for(Method method : methods){
            //System.out.println(method);
        }
        //System.out.println("************getDeclaredMethods方法************");
        //getDeclaredMethods()会获取本类中所有的成员方法,不考虑修饰符,不包括父类。
        Method[] methods2=u1Class.getDeclaredMethods();
        for(Method method : methods2){
            //System.out.println(method);
        }    
		/*
		// 第二种方式获取Class对象
		Class u2 = User.class;
		System.out.println(u2);

		// 第三种方式获取Class对象
		try {
			Class u3 = Class.forName("com.reflect.User");// 注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			//判断三种方式,获取结果是否一致
			System.out.println(u2 == u1Class);// 判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
			System.out.println(u3 == u1Class);// 判断三种方式是否获取的是同一个Class对象
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		*/
	}
}

getFields()和getDeclaredFields()

getFields()和getDeclaredFields()都是用来获取成员变量的方法
getFields()方法获取成员变量,会获取所有public修饰的成员变量,包括父类
getDeclaredFields()方法会获取本类中所有的成员变量,不考虑修饰符,不包括父类。
在这里插入图片描述

getConstructors()和getDeclaredConstructors()

getConstructors()方法获取构造函数,获取本类中所有public修饰的构造函数,不包括父类。
getDeclaredConstructors()方法会获取本类中所有的构造函数,不考虑修饰符,不包括父类。
在这里插入图片描述

getMethods()和getDeclaredMethods()

getMethods()方法获取成员方法,获取所有public修饰的成员方法,包括父类和超类。
getDeclaredMethods()会获取本类中所有的成员方法,不考虑修饰符,不包括父类。
在这里插入图片描述
参考资料
https://blog.youkuaiyun.com/Mr_wxc/article/details/106003401

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值