20.反射编程

1.Class类对象实例化

package cn.mldn.demo;
class Member {}
public class JavaReflectDemo {
	public static void main(String[] args) throws Exception {
		// 【操作特点】需要获取一个类的实例化对象之后才可以获取Class类实例
		Member member = new Member() ;					// 实例化Member类对象
		Class<?> clazz = member.getClass() ; 				// 获取Class类实例化对象
		System.out.println(clazz);
	}
}	
package cn.mldn.demo;
class Member {}
public class JavaReflectDemo {
	public static void main(String[] args) throws Exception {
		// 【操作特点】直接通过一个类的完整名称可以获取Class类实例,需要编写import或编写完整类名称
		Class<?> clazz = Member.class ; 				// 获取Class类实例化对象
		System.out.println(clazz);
	}
}
package cn.mldn.demo;
class Member {}
public class JavaReflectDemo {
	public static void main(String[] args) throws Exception {
		// 【操作特点】通过名称字符串(包.类)可以获取Class类实例,可以不使用import导入
		Class<?> clazz = Class.forName("cn.dn.demo.Member") ; 	// 获取Class类实例化对象
		System.out.println(clazz);
	}

2.反射调用构造

package cn.mldn.demo;
import java.lang.reflect.Constructor;
class Mail {
	private String msg ;
	public Mail() {}												// 无参构造
	public Mail(String msg) {										// 单参构造
		System.out.println("【构造方法】调用Mail类单参构造方法,实例化对象");
		this.msg = msg ;
	}
	@Override
	public String toString() {									// 对象信息
		return "【toString()覆写】消息内容:" + this.msg;
	}
}
public class JavaReflectDemo {
	public static void main(String[] args) throws Exception {
		Class<?> cls = Mail.class ; 								// 获取指定类的Class对象
		Constructor<?>[] constructors = cls.getDeclaredConstructors() ; // 获取全部构造
		for (Constructor<?> cons : constructors) {
			System.out.println(cons);
		}
		// 获取单参构造并且参数类型为String的构造方法对象实例
		Constructor<?> cons = cls.getDeclaredConstructor(String.class) ;
		Object obj = cons.newInstance("www.ml.cn") ;				// 调用单参构造实例化对象
		System.out.println(obj);
	}
}

3.反射调用方法

package cn.mldn.demo;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
class Mail {
	public boolean connect() {
		return true ;
	}
	public void send() {
		System.out.println("发送信息:www.m.cn");
	}
}
public class JavaReflectDemo {
	public static void main(String[] args) throws Exception {
		Class<?> cls = Mail.class ; 								// 获取指定类的Class对象
		Method methods[] = cls.getMethods();						// 获取全部方法
		for (Method met : methods) {								// 输出方法信息
			int mod = met.getModifiers(); 						// 方法修饰符
			System.out.print(Modifier.toString(mod) + " ");
			System.out.print(met.getReturnType().getName() + " ");
			System.out.print(met.getName() + "(");
			Class<?> params[] = met.getParameterTypes(); 			// 获取参数类型
			for (int x = 0; x < params.length; x++) {
				System.out.print(params[x].getName() + " " + "arg-" + x);
				if (x < params.length - 1) {						// 控制“,”输出
					System.out.print(",");
				}
			}
			System.out.print(")");
			Class<?> exp[] = met.getExceptionTypes();				// 获取异常信息
			if (exp.length > 0) {
				System.out.print(" throws ");
			}
			for (int x = 0; x < exp.length; x++) {
				System.out.print(exp[x].getName());
				if (x < exp.length - 1) {							// 控制“,”输出
					System.out.println(",");
				}
			}
			System.out.println(); // 换行
		}
	}
}

4反射调用成员

package cn.mldn.demo;
import java.lang.reflect.Field;
interface IChannelService {
	public static final String NAME = "mjava" ;
}
abstract class AbstractBase {
	protected static final String BASE = "www.ml.cn" ;
	private String info = "Hello MLDN" ;
}
class Member extends AbstractBase implements IChannelService {
	private String name ;
	private int age ; 
}
public class JavaReflectDemo {
	public static void main(String[] args) throws Exception {
		Class<?> cls = Member.class ; 								// 指定类Class对象
		{
			Field fields [] = cls.getFields() ;						// 获取公共成员属性
			for (Field fie : fields) {
				System.out.println(fie);
			}
		}
		System.out.println("-------------------------------------------------");
		{
			Field fields [] = cls.getDeclaredFields() ;				// 获取本类成员属性
			for (Field fie : fields) {
				System.out.println(fie);
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值