目录
一、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();
}
}