一、JAVA反射机制--入门篇详解

目录

 

一、JAVA反射机制基本概念

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

三、代码实例

四、获取类方法及调用


一、JAVA反射机制基本概念

反射:动态获取类中信息,动态调用其方法,相当于对类的剖析。

通过反射机制+配置文件,可以提高应用程序的扩展性。毕竟面对配置文件比面对源代码方便多了。

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

1、通过 Object类中的getClass()方法--太麻烦、不常用。

2、通过静态属性.class来获取相应的Class对象--需要用到类中的静态属性。

3、通过给定的类的字符串名称--相对较好。

三、代码实例

首先创建一个类,其实Class也很像普通的类,包括一些类的属性及函数名称。

然后就是简单测试,注意一下三种方法的不同,其中最后一个函数是获取类中的各个函数:

package design;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

import ch11.Student;

public abstract class Main {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Student stu=new Student();
		Class class1=stu.getClass();
		System.out.println(class1);
		System.out.println("-------------");
		Class class2=Student.class;
		System.out.println(class2);
		System.out.println("-------------");
		String className="ch13.Student";//注意这里是包名+类名
		Class<?> class3=Class.forName(className);
		System.out.println(class3);
		Method []MethodArray=class3.getMethods();
		MethodArray=class3.getDeclaredMethods();
		for(Method method:MethodArray)
		{
			System.out.println(method);//
		}
		Method method1=class3.getMethod("showInformation");
		System.out.println(method1);
		String className1="ch13.Main1";
		Class<?>class4=Class.forName(className1);
		Method method2=class4.getMethod("main", String[].class);
		System.out.println(method2);
		method2.invoke(null, (Object)new String[] {"a","b","c"});
	}

}

四、获取类方法及调用

1、有无参构造函数调用及使用

package design;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DateFormat.Field;
import java.util.Scanner;

import ch13.Student;

public abstract class Main {
	public static <Fields> void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
		Student stu=new Student();
		Class class1=stu.getClass();
		System.out.println(class1);
		System.out.println("-------------");
		Class class2=Student.class;
		System.out.println(class2);
		System.out.println("-------------");
		String className="ch13.Student";//注意这里是包名+类名
		Class<?> class3=Class.forName(className);
		System.out.println(class3);
		Method []MethodArray=class3.getMethods();
		MethodArray=class3.getDeclaredMethods();
		for(Method method:MethodArray)
		{
			System.out.println(method);//
		}
		Method method1=class3.getMethod("showInformation");
		System.out.println(method1);
		String className1="ch13.Main1";
		Class<?>class4=Class.forName(className1);
		Method method2=class4.getMethod("main", String[].class);
		System.out.println(method2);
		method2.invoke(null, (Object)new String[] {"a","b","c"});
		//Class MyObjects=MyObject.class;
		//Field获取成员变量
		java.lang.reflect.Field[] field=class3.getDeclaredFields();
		for(java.lang.reflect.Field f:field)
		{
			System.out.println(f);
		}
		/*
		 * 第四部分
		 */
		System.out.println("--------获取所有方法,不包含构造函数!!");
		MethodArray=class3.getMethods();
		for(Method m:MethodArray)
			System.out.println(m);
		System.out.println("--------获取构造函数,必须要有无参数的构造函数,没有的话看下面的方法!!");
		Class<?>class5=Class.forName(className);
		Constructor []cons=class5.getDeclaredConstructors();
		for(Constructor c:cons)
		{
			System.out.println(c);
		}
		Constructor con=class5.getConstructor();
		Object obj=con.newInstance();
		System.out.println(obj);
		Student stu1=(Student)obj;
		stu1.showInformation();
		System.out.println("--------获取有参数函数!!");
		Constructor con1=class5.getConstructor(String.class,String.class,int.class);
		Object obj1=con1.newInstance("niss","22",44);
		Student stu2=(Student)obj1;
		stu2.showInformation();
		
		
		
	}

}

 2、公共、私有、保护函数的获取及调用

package design;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DateFormat.Field;
import java.util.Scanner;

import ch13.Student;

public abstract class Main {
	public static <Fields> void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
		/*Student stu=new Student();
		Class class1=stu.getClass();
		System.out.println(class1);
		System.out.println("-------------");
		Class class2=Student.class;
		System.out.println(class2);
		System.out.println("-------------");
		String className="ch13.Student";//注意这里是包名+类名
		Class<?> class3=Class.forName(className);
		System.out.println(class3);
		Method []MethodArray=class3.getMethods();
		MethodArray=class3.getDeclaredMethods();
		for(Method method:MethodArray)
		{
			System.out.println(method);//
		}
		Method method1=class3.getMethod("showInformation");
		System.out.println(method1);
		String className1="ch13.Main1";
		Class<?>class4=Class.forName(className1);
		Method method2=class4.getMethod("main", String[].class);
		System.out.println(method2);
		method2.invoke(null, (Object)new String[] {"a","b","c"});
		//Class MyObjects=MyObject.class;
		//Field获取成员变量
		java.lang.reflect.Field[] field=class3.getDeclaredFields();
		for(java.lang.reflect.Field f:field)
		{
			System.out.println(f);
		}*/
		/*
		 * 第四部分
		 */
		String className="ch13.Student";//注意这里是包名+类名
		Class<?> class5=Class.forName(className);
		System.out.println(class5);
		Method []MethodArray=class5.getMethods();
		System.out.println("-------------");
		System.out.println("--------获取所有方法,不包含构造函数!!");
		MethodArray=class5.getMethods();
		for(Method m:MethodArray)
			System.out.println(m);
		System.out.println("--------获取构造函数,必须要有有参数的构造函数!!");
		Constructor []cons=class5.getDeclaredConstructors();
		for(Constructor c:cons)
		{
			System.out.println(c);
		}
		Constructor con=class5.getConstructor();
		Object obj=con.newInstance();
		System.out.println(obj);
		Student stu1=(Student)obj;
		stu1.showInformation();
		System.out.println("--------获取有参数函数!!");
		Constructor con1=class5.getConstructor(String.class,String.class,int.class);
		Object obj1=con1.newInstance("niss","22",44);
		Student stu2=(Student)obj1;
		stu2.showInformation();
		System.out.println("--------获取有参数函数,并调用相应函数!!");
		Method m=class5.getMethod("setGrade", int.class);
		System.out.println("实例化!!");
		obj1=con1.newInstance("miss","22",44);
		m.invoke(obj1, 100);
		Student stu3=(Student)obj1;
		stu3.showInformation();
		System.out.println("函数原型:"+m);
		System.out.println("上面就成功修改了成绩--44-->100");
		/*
		 * 私有、保护类型
		 */
		Method m1=class5.getDeclaredMethod("setName1", String.class);
		System.out.println(m1);
		m1.setAccessible(true);//强制访问
		Object string =m1.invoke(obj1, "小周");
		System.out.println(string);
		System.out.println("上面是获取并调用私有方法");
		Method m2=class5.getDeclaredMethod("setName2", String.class);
		//String.class是参数类型
		m2.setAccessible(true);
		System.out.println(m2);
		System.out.println(m2.invoke(obj1, "小王"));
		Student stu4=(Student)obj1;
		stu4.showInformation();
		
	}

}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/89005603