一, Java反射是在动态的获取类, 类属性, 类方法, 类构造方法等内部一些类的信息。
目的是为了让代码效率更高,更具有普适性!例:以下为简单的创建一个对象:
1.获取三种方式
Class.forName("包名+ 类名");
类.class
对象.getClass()
2.获取构造方法对象
class对象.getConstructor();
construct对象.newInstance();根据构造方法实例化对象
3.获取方法对象
class对象.getMethod(String name, Class<?> ...parameterType);
method对象.invoke(Object obj, Object... initargs);
package com.xcl_Q;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Pig {
String name;
int age;
public Pig(){
}
public Pig(String name){
this.name = name;
}
private Pig (String name,int age){
}
public void eat(){
System.out.println("吃大盘鸡拌面!");
}
private void eat(String name){
System.out.println("吃大盘鸡拌面!");
this.name = name;
}
}
public class Demo4 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//获取一个类对象的三种方式
//第一步为:获取class对象
//1, 首先获取class对象(包含了类里面的所有信息)
Class<Pig> pigClass = Pig.class;
System.out.println("第一种class类对象声明方式:" + pigClass);
//2, 获取class对象的第二种方式(以类权限命名)(包含了类里面的所有信息)
Class<?> aClass = Class.forName("com.xcl_Q.Pig");
System.out.println("第二种class类对象声明方式:" +aClass);
//3, 获取class对象的第三种方式(包含了类里面的所有信息)
Class<? extends Pig> aClass1 = new Pig().getClass();
System.out.println("第三种class类对象声明方式:" +aClass1);
//第二步为:通过class类对象来获取构造方法
System.out.println("constructor==============1");
// 以下是获取Constructor的构造方法对象
Constructor<Pig> constructor = pigClass.getConstructor();
System.out.println("得到一个构造方法"+constructor);
System.out.println("getConstructors=================2");
Constructor<?>[] constructors = pigClass.getConstructors();
for (Constructor<?> constructor1 : constructors) {
System.out.println("将每一个构造方法遍历出来:"+constructor1);}
System.out.println("getDeclaredConstructors===============3");
Constructor<?>[] declaredConstructors = pigClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
System.out.println("getDeclaredConstructor=============4");
Constructor<Pig> declaredConstructor = pigClass.getDeclaredConstructor();
for (Constructor<?> declaredConstructor1 : declaredConstructors) {
System.out.println(declaredConstructor1);
}
//第三步为: 创建对象!
Pig pig = constructor.newInstance();
//下面为获取方法的简单介绍:
System.out.println("获取类的所有方法:(包含了父类所有的可以继承的方法)");
Method[] methods = pigClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
//获取本类的方法:
Class<Pig> pigClass1 = Pig.class;//首先先创建一个class对象
Pig pig1 = pigClass1.newInstance();//通过class对象来实例化一个对象
System.out.println("首先通过类对象来获取方法========下面为无参构造");
Method eat = pigClass1.getMethod("eat",null);
eat.invoke(pig1,null);//传的参数为实例化对象 (这个方法为无参构造方法)
System.out.println("下面为有参构造==========");
//首先创建方法对象
Method eat1 = pigClass1.getDeclaredMethod("eat",null);
eat1.setAccessible(true);//用方法对象来暴力反射私有化的方法
eat1.invoke(pig1,null);//然后用方法对象来执行方法就可以了
/**
* 一 总结:
* 1, getMethod (string name , class<?> ... parameterType)
* (。2)如果为有参构造的话 Method eat1 = pigClass1.getDeclaredMethod("eat",null);
* 那么getDeclaredMethod("方法名字",null(数据类型.class))私有化的方法可以暴力反射setAccible(true)来进行,然后用
* 方法来自己执行方法
* (·1)如果为无参构造的话Method eat = pigClass1.getMethod("方法名字",null);
*/
}
}