反射

反射

反射机制:反射就是通过获取该类的字节码文件对象。

获取方式:

1>Object类中的getClass()方法,表示正在运行的那个类:Class类。

2>数据类型的Class属性

3>Class类中的特有方法:forName(String className):(重点)

public static Class<?> forName(String className):获取字节码文件对象。字符串的内容是一个类的全路径名称。

获取所有公共构造方法:

public Constructor<?>[] getConstructors():返回的是一个构造方法所在数组。

获取所有构造方法:

public Constructor<?>[] getDeclaredConstructor():获取的是当前字节码文件对象中所有的构造方法.

获取单个构造方法:

public Constructor<T> getConstructor(Class<?>...parameterTypes):返回的是一个Constructor对象,反映Class对象所表示的类的指定公共构造方法。

public T newInstance(Object... initargs):传递的是实际参数,表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例.

相关代码:

public class Person {
		private String name;
		int age;
		public String address;
		public Person(){}
		private Person(String name){
			this.name=name;
		}
		Person(String name,int age){
			this.name=name;
			this.age=age;
		}
		public Person(String name,int age,String address){
			this.name=name;
			this.age=age;
			this.address=address;
		}
		public void show(){
			System.out.println("show");
		}
		public void method(String s){
			System.out.println("method"+s);
		}
		public String getString(String s,int i){
			return s+"---"+i;
		}
		private void function(){
			System.out.println("function");
		}
		@Override
		public String toString() {
			return "Person [name=" + name + ", age=" + age + ", address="
					+ address + "]";
		}
		
}
//获取构造方法
import java.lang.reflect.Constructor;

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		Class c = Class.forName("westos_01.Person");
		Constructor[] con=c.getConstructors();
		
		for(Constructor constructor:con){
			System.out.println(constructor);
		}
		System.out.println("----------------");
		Constructor[] con1=c.getDeclaredConstructors();
		for(Constructor constructor1:con1){
			System.out.println(constructor1);
		}
		System.out.println("----------------");
		Constructor con2=c.getConstructor();
		Object newInstance = con2.newInstance();
		System.out.println(newInstance);
		System.out.println("----------------");
		Constructor con3=c.getConstructor(String.class,int.class,String.class);
		Object newInstance2 = con3.newInstance("立华奏",20,"音无");
		System.out.println(newInstance2);
	}
}

获取成员变量:

获取所有公共成员变量:

public Field[] getField():返回的Field对象数组。

获取单个公共成员变量:

public Field getField(String name):获取公共的指定的字段。参数为当前成员变量名称

将指定对象变量上此 Field 对象表示的字段设置为指定的新值public void set(Object obj, Object value).

public Field getDeclaredField(String name):获取类或接口中已经声明的指定的字段.

public void setAccessible(boolean flag):在访问的时候取消java语言访问检查(强制性).值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查.

相关代码:

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

public class Reflect2Demo {
	public static void main(String[] args) throws Exception {
		Class c=Class.forName("westos_01.Person");
		Field[] fields = c.getFields();
		for(Field f:fields){
			System.out.println(f);
		}
		System.out.println("-------------------");
		Constructor con=c.getConstructor();
		Object object = con.newInstance();
		Field field = c.getField("address");
		field.set(object, "立华奏");
		System.out.println(object);
		System.out.println("-------------------");
		Field declaredField = c.getDeclaredField("name");
		declaredField.setAccessible(true);
		declaredField.set(object, "音无");
		System.out.println(object);
		System.out.println("-------------------");
		Field declaredField2 = c.getDeclaredField("age");
		declaredField2.setAccessible(true);
		declaredField2.set(object, 20);
		System.out.println(object);
		
	}
}

获取成员方法:

获取所有公共成员方法:

public Method[] getMethods():获取当前该字节码文件对象(Person.class)中自己本身以及它父类中所有的公共成员方法.

public Method[] getDeclaredMethods():获取当前字节码文件对象本身所有的成员方法

获取单个公共成员方法:

public Method getMethod(String name,Class<?>... parameterTypes):指定公共成员方法。参数1:表示方法名;参数2:该方法的参数类型的Class对象:String.class

public Object invoke(Object obj, Object... args)参数1:表示当前针对哪个以实例对象进行方法的调用,参数2:当前调用该方法的时候里面传递的实际参数。

public Method getDeclaredMethod(String name,Class<?>... parameterTyape'nrs):获取的是已经指定的声明方法。

相关代码:

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

public class Reflect3Demo {
	public static void main(String[] args) throws Exception {
		Class c=Class.forName("westos_01.Person");
		Method[] m=c.getMethods();
		for(Method mt:m){
			System.out.println(mt);
		}
		Constructor con=c.getConstructor();
		Object object = con.newInstance();
		Method m1=c.getMethod("show");
		m1.invoke(object);
		System.out.println("-----------------------");
		Method m2=c.getMethod("method", String.class);
		m2.invoke(object, "method");
		System.out.println("-----------------------");
		Method m3=c.getMethod("getString", String.class,int.class);
		String getString=(String) m3.invoke(object, "立华奏",20);
		System.out.println(getString);
		System.out.println("-----------------------");
		Method m4=c.getDeclaredMethod("function");
		m4.setAccessible(true);
		m4.invoke(object);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值