Class类实例化对象&取得类的结构

本文通过一个具体的示例,深入介绍了如何使用Java反射API来获取类的详细信息,包括构造方法、属性、接口、父类及所有方法等。此外,还展示了如何利用反射创建对象并调用其方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过一个demo熟悉class类的用法。

1.Person3.java

包含一个China接口和Person3类,一些简单方法

package com.yyj.Class;

interface China{	// 定义China接口
	public static final String NATIONAL = "China" ;	// 定义全局常量
	public static final String AUTHOR = "yyj" ;	// 定义全局常量
	public void sayChina() ;		// 无参的,没有返回值的方法
	public String sayHello(String name,int age) ;	// 定义有两个参数的方法,并返回内容
}

public class Person3 implements China{
	private String name ;
	private int age ;
	public Person3(){	// 无参构造
	}
	public Person3(String name){
		this.name = name ;	// 设置name属性
	}
	public Person3(String name,int age){
		this(name) ;
		this.age = age ;
	}
	public void sayChina(){	// 覆写方法
		System.out.println("作者:" + AUTHOR + ",国籍:" + NATIONAL) ;
	}
	public String sayHello(String name,int age){
		return "我是" +name + ",我今年" + age + "岁了!" ;
	}
	public void setName(String name){
		this.name = name ;
	}
	public void setAge(int age){
		this.age = age ;
	}
	public String getName(){
		return this.name ;
	}
	public int getAge(){
		return this.age ;
	}
};

2.getAllAboutClass.java

(1)使用Class类进行Person3类的实例化和per对象的实例化,调用基本方法

(2)取得Person3类的结构:构造方法、属性、接口、父类、全部方法。

package com.yyj.Class;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class getAllAboutClass {
	public static void main(String args[]) {
		Class<?> c = null;// 声明class对象
		try {
			c = Class.forName("com.yyj.Class.Person3");// 实例化class对象为person3类
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Person3 per=null;
		try {
			per=(Person3)c.newInstance();//person3对象的实例化
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		per.sayChina();
		per.setName("yyj");
		per.setAge(23);
		System.out.println(per.sayHello("yyj",23));
		// -----输出person3类中全部构造方法:访问权限修饰符+返回值类型+方法名+参数
		Constructor<?> con[] = c.getConstructors();// 取得类中全部构造方法
		System.out.println("person类中全部构造方法:");
		for (int i = 0; i < con.length; i++) {
			int mo = con[i].getModifiers(); // 取得第i个构造方法的访问权限修饰符
			System.out.print(Modifier.toString(mo) + " ");// 得到修饰符名并打印
			System.out.print(con[i].getName() + " ");// 得到方法名并打印
			Class<?> param[] = con[i].getParameterTypes();
			System.out.print("(");
			for (int j = 0; j < param.length; j++) {
				System.out.print(param[j].getName() + " args" + j);
				if (j < param.length - 1) {
					System.out.print(",");
				}
			}
			System.out.println(")");
		}
		// -----person3类公共属性:修饰符+类型+属性名称
		System.out.println("公共属性:");
		Field f[] = c.getFields();// 取得公共属性
		for (int i = 0; i < f.length; i++) {
			int mo = f[i].getModifiers();// 取得属性修饰符(数字)
			System.out.print(Modifier.toString(mo) + " ");// 还原修饰符
			Class<?> t = f[i].getType();// 取得属性类型
			System.out.print(t.getName() + " ");// 输出属性类型名称
			System.out.println(f[i].getName());// 输出属性名称
		}
		// -----本类属性:修饰符+类型+属性名称
		System.out.println("本类属性:");
		Field df[] = c.getDeclaredFields();// 取得本类属性
		for (int i = 0; i < df.length; i++) {
			int mo = df[i].getModifiers();// 取得属性修饰符(数字)
			System.out.print(Modifier.toString(mo) + " ");// 还原修饰符
			Class<?> t = df[i].getType();// 取得属性类型
			System.out.print(t.getName() + " ");// 输出属性类型名称
			System.out.println(df[i].getName());// 输出属性名称
		}
		// -----person3类实现的接口
		System.out.println("person3类实现的接口:");
		Class<?> inter[] = c.getInterfaces();
		for (int i = 0; i < inter.length; i++) {
			System.out.println(inter[i].getName());
		}
		// -----person3类继承的父类
		System.out.println("person3类继承的父类:");
		Class<?> fa = c.getSuperclass();
		System.out.println(fa.getName());
		// -----person3类全部方法
		System.out.println("person3类全部方法:");
		Method m[] = c.getMethods(); // 取得全部方法
		for (int i = 0; i < m.length; i++) {
			Class<?> r = m[i].getReturnType(); // 得到返回值类型
			Class<?> p[] = m[i].getParameterTypes(); // 取得全部参数的类型
			int xx = m[i].getModifiers(); // 得到修饰符
			System.out.print(Modifier.toString(xx) + " "); // 输出修饰符
			System.out.print(r + " ");
			System.out.print(m[i].getName());
			System.out.print("(");
			for (int j = 0; j < p.length; j++) {
				System.out.print(p[j].getName() + " " + "arg" + j);
				if (j < p.length - 1) {
					System.out.print(",");
				}
			}
			Class<?> ex[] = m[i].getExceptionTypes(); // 取出异常
			if (ex.length > 0) {
				System.out.print(") throws ");
			} else {
				System.out.print(")");
			}
			for (int j = 0; j < ex.length; j++) {
				System.out.print(ex[j].getName());
				if (j < p.length - 1) {
					System.out.print(",");
				}
			}
			System.out.println();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值