Java反射

Java反射机制

Java反射的定义

Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

Java反射的三种方式

1.通过Object类的getClass()方法

2.通过对象实例方法

3.通过Class.forName(String Name)

实例1`.

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


class Plane{
    public float A;
    public float B;
    public float C;
    // 计算飞机运行速度:A*B/C
	public float computeSpeed() {
		// TODO Auto-generated method stub
		float speed = this.A*this.B/this.C;
		System.out.println("飞机运行速度为:");
		System.out.println(speed);
		return speed;
	}

}

public class TestReflect {
    
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// 方式1
		Plane p1 = new Plane();
		Class c1 = p1.getClass();
		// 输出类名
		System.out.println(c1.getName());
		
		// 方式2
		Class c2 = Plane.class;
		System.out.println(c2.getName());
		
		// 方式3
		String className = "a.Plane";
		// 注意一定要写"包名.类名",不能只写类名。
		Class <?> cls = Class.forName(className);
		// 获取该类的无参构造函数(任何类型,包括私有的)
		Constructor<?> constructor = cls.getDeclaredConstructor();
		// 用无参构造函数new一个对象,等价与Plane p3 = new Plane();
		Plane p3 = (Plane)constructor.newInstance();
		p3.A = 30;
		p3.B = 40;
		p3.C = 30;
		p3.computeSpeed();
	}

}

运行结果:
a.Plane
a.Plane
飞机运行速度为:
40.0

第三种反射方式再深入

1.获取构造函数的方法

2.获取类的方法

3.获取类的属性的方法

getDeclaredConstructor():可以获取所有类型的构造函数
getConstruct():只能获取public的构造函数
获取方法和属性的方法也类似。
获取具有参数的构造的方法:getDeclaredConstructor(parameterTypes),parameterTypes为参数的类型,用类型名.class的形式依次填入,如:String.class,若要获取无参,则参数不写即可。
获取具有参数的函数的方法:getDeclaredMethod(name, parameterTypes),name为方法的名字(字符串型),parameterTypes为参数的类型,用类型名.class的形式依次填入,如:String.class。
实例2`.

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


class Plane{
    public float A;
    public float B;
    public float C;
    // 计算飞机运行速度:A*B/C
    public Plane() {
    	System.out.println("在调用无参公共构造函数>>>");
    }
    public Plane(float a, float b, float c) {
    	System.out.println("在调用三个float型参数的公共构造函数>>>");
    	this.A = a;
    	this.B = b;
    	this.C = c;
    }
	public float computeSpeed() {
		// TODO Auto-generated method stub
		float speed = this.A*this.B/this.C;
		System.out.println("飞机运行速度为:");
		System.out.println(speed);
		return speed;
	}
	public void test1() {
		System.out.println("在调用方法test1()>>>");
	}
	public void test2(String name) {
		System.out.printf("在调用方法%s>>>", name);
	}

}

public class TestReflect {
    
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		// 获取构造函数
		
		String className = "a.Plane";
		// 注意一定要写"包名.类名",不能只写类名。
		Class <?> cls = Class.forName(className);
		// 获取该类的具有参数的构造函数
		Constructor<?> constructor1 = cls.getDeclaredConstructor();
		// 用无参构造函数new一个对象,等价与Plane p1 = new Plane();
		Plane p1 = (Plane)constructor1.newInstance();
		// 给成员变量赋值
		p1.A = 30;
		p1.B = 40;
		p1.C = 30;
		p1.computeSpeed();
		// 获取该类的具有参数的构造函数
		Constructor<?> constructor2 = cls.getDeclaredConstructor(float.class, float.class, float.class);
		// 用带参构造函数new一个对象
		Plane p2 = (Plane)constructor2.newInstance(60, 80, 60);
		p2.computeSpeed();
		
		// 获取类的方法
		// 获取无参方法
		Method t1 = cls.getDeclaredMethod("test1");
		// 使用该方法
		t1.invoke(p1);
		// 获取有参方法
		Method t2 = cls.getDeclaredMethod("test2", String.class);
		t2.invoke(p1, "test2()");
		
		// 获取类的属性
		Field A = cls.getField("A");
		// 设置A的值
		A.set(p1, 50);
	}

}

运行结果:
在调用无参公共构造函数>>>
飞机运行速度为:
40.0
在调用三个float型参数的公共构造函数>>>
飞机运行速度为:
80.0
在调用方法test1()>>>
在调用方法test2()>>>

你可能感兴趣的:(java)