java中的反射的构造方法、成员变量、普通方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45104211/article/details/99868932

一、构造方法 ( Constructor)

    1、 获取含有public修饰的构造方法   getConstructor()、getConstructors()

package reflect;

public class Student {

	public void doHomework() {
		System.out.println(name+"正在写作业~~~");
	}
	
	String name;
	
	public Student() {
		
	}
	
	public Student(String name) {
		this.name =name;
	}
}

        一、单个获取:

        getConstructor(Class ... para ):该方法可以获取到Class类中的单个public 修饰符修饰的 构造方法:

package reflect;

import java.lang.reflect.Constructor;

public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Constructor constructor =clazz.getConstructor(String.class);
			System.out.println(constructor);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        二、多个获取

        getConstructors():返回一个Constructor类型的数组

package reflect;

import java.lang.reflect.Constructor;

public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Constructor [] constructor =clazz.getConstructors();
			for (Constructor letters : constructor) {
				System.out.println(letters);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        可以看到:返回的数组可以使用加强遍历的方法进行逐个查询

    2、可以获取全部的构造方法   getDeclaredConstructor(Class ... para)、getDeclaredConstructors()

package reflect;

public class Student {

	public void doHomework() {
		System.out.println(name+"正在写作业~~~");
	}
	
	String name;
	
	public Student(int age) {
		System.out.println(age)
	}
	
	private Student(String name) {
		this.name =name;
	}
}

        一、单个导出:

        getDeclaredConstructor(Class ... para):

package reflect;

import java.lang.reflect.Constructor;

public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Constructor constructor =clazz.getDeclaredConstructor(String.class);
			System.out.println(constructor);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        此时的构造放方法被private修饰:结果就是

        二、多个导出(加强循环)

    package reflect;

    import java.lang.reflect.Constructor;
    public class Test{
	    public static void main(String[] args) {
		    Class clazz;
		    clazz=Student.class;
		    Constructor [] constructors=clazz.getConstructors();
		    for (Constructor constructor : constructors) {
			System.out.println(constructor.getName());
		    }
        }
    }

三、获取的构造方法作用

package reflect;

public class Student {

	public void doHomework() {
		System.out.println(name+"正在写作业~~~");
	}
	
	String name;
	
	public Student(int age) {
		System.out.println(age)
	}
	
	private Student(String name) {
		this.name =name;
	}
}

    1、获取相应的参数:

        一、获取权限修饰   getModifiers()方法 :返回一个整型    Modifier.toString(int )可将整型返回一个字符修饰符对应的字符串

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		Constructor [] constructors=clazz.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor.getName());
			int j=constructor.getModifiers();
			System.out.println(Modifier.toString(j));
		}
	}
}

        二、获取类名: getDeclaringClass(): 获取构造犯法对应的类的位置

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		Constructor [] constructors=clazz.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor.getDeclaringClass());
		}
	}
}

        

        三、获取参数列表  :getParameterTypes()方法返回一个class类的数组,输出对应参数列表中的class类

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		Constructor [] constructors=clazz.getConstructors();
		for (Constructor constructor : constructors) {
			Class [] zz=constructor.getParameterTypes();
			for (Class class1 : zz) {
				System.out.println(class1);
			}
		}
	}
}

        四、使用反射创建对象: newInstance(class . . . Param):输入再创建对象时所需要的形参

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Constructor constructor=clazz.getConstructor(String.class);
			Student stu=(Student)constructor.newInstance("Tom");
			System.out.println(stu.name);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

package reflect;

public class Student {
	private Student() {
		
	}
}

        setAccessible(boolean flag):可以忽略构造方法前面的private修饰:

package reflect;

import java.lang.reflect.Constructor;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Constructor constructor= clazz.getDeclaredConstructor();
			constructor.setAccessible(true);
			constructor.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

二、方法  (Method)

package reflect;

public class Student {

	public static void doHomework(String name) {
		System.out.println(name+"正在写作业~~~");
	}
	private static void move(String age) {
		System.out.println(age+"正在移动");
	}
}

背景 :由于方法的反射与构造方法的反射极其类似:一下简写重复内容

    1、获取方法:

    getMethods():

    获取父类和子类中的全部:public 修饰的方法

package reflect;

import java.lang.reflect.Method;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		Method [] methods = clazz.getMethods();
		for (Method method : methods) {
			System.out.println(method.getName());
		}
	}
}

    结果如下图:其中大部分除doHomework 其他的都是父类中继承的方法

    getDeclaredMethods():  找到本类中的全部方法

package reflect;

import java.lang.reflect.Method;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		Method [] methods = clazz.getDeclaredMethods();
		for (Method method : methods) {
			System.out.println(method.getName());
		}
	}
}

    getDeclaredMethod(String name,Class ... Param):输入方法的名字和参数列表,即可获得class类中的方法

package reflect;

import java.lang.reflect.Method;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Method method =clazz.getDeclaredMethod("move", String.class);
			System.out.println(method.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

    这里可以反射非public 方法

    getMethod(String name,Class ... Param):查找父类本类中的public方法

    2、基本方法:

        一、获取修饰符  :getModifier()    Modifier.toString()   

        二、获得类名:  getDeclaringClass()

        三、获得参数列表:Class<?>[] getParameterTypes()

        四、获得返回值:method.getReturnType()

package reflect;

import java.lang.reflect.Method;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Method method =clazz.getDeclaredMethod("move", String.class);
			Class zz=method.getReturnType();
			System.out.println(zz.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        执行代码:返回 void

    3、通过反射调用方法: invoke(Object obj, Object... args):   前面实例对象    后面参数列表调用

package reflect;

import java.lang.reflect.Method;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Method method =clazz.getDeclaredMethod("move", String.class);
			method.setAccessible(true);
			method.invoke(new Student(), "Tom");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

    此处使用的move被private修饰。  所以必须使用setAccessible(boolea flag)把权限屏蔽掉

三、成员变量 ( Field)

package reflect;

public class Student {

	private String name;
	
	public String id;
}

    1、获取成员变量

    一、getField(String name)

    二、getFields()   

    前两个均是可以得到继承类和本类的成员变量:

package reflect;

public class Father {

	public String has;
	
}

    使Student继承该Father类执行下面代码:

package reflect;

import java.lang.reflect.Field;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Field[] field =clazz.getFields();
			for (Field field2 : field) {
				System.out.println(field2.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

    三、getDeclaredField(String name);

    四、getDeclaredFields();

    均是获得本类中的全部方法:

package reflect;

import java.lang.reflect.Field;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Field[] field =clazz.getDeclaredFields();
			for (Field field2 : field) {
				System.out.println(field2.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

    2、基本方法

        一、获取修饰符  :getModifier()    Modifier.toString()   

        二、获得类名:  getDeclaringClass()

        三、获得本身的class类型:getTYPE()   [返回值不再是数组]

package reflect;

import java.lang.reflect.Field;
public class Test{
	public static void main(String[] args) {
		Class clazz;
		clazz=Student.class;
		try {
			Field[] field =clazz.getDeclaredFields();
			for (Field field2 : field) {
				System.out.println(field2.getType());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

    3、使用成员变量

        一、void setAccessible(boolean flag)

        二、get(Object obj)//获得获得的Field本身被赋予的值          返回一个Object类   括号中是实例化对象

        三、set(Object obj, Object value)//为Field赋予值  前面一个是实例化对象   后面的是具体的值

package reflect;

import java.lang.reflect.Field;
public class Test{
	public static void main(String[] args) {
		Student stu =new Student();
		Class clazz;
		clazz=Student.class;
		try {
			Field field =clazz.getDeclaredField("name");
			field.setAccessible(true);
			field.set(stu, "Tom");
			System.out.println(field.get(stu));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        

猜你喜欢

转载自blog.csdn.net/weixin_45104211/article/details/99868932