java反射基础
反射~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
java开发:
1.XXX.java...
属性:类 Field
方法:类 Method
构造:类 Constructor<T>
2.XXX.class
反射:
万事万物皆对象
字节码文件:Class类:jdk
Person.java--->Person.class
1.如何获取Class类的对象
方法一:通过对象获取Class类
Class类:
对象.getClass();
方法二:通过Class.forName()
Class.forName("包名.类名");-->Class
方法三:类名.class
Person.class--->Class
Method类:用于描述方法的对象
类中的每一个方法,其实也有对象和它对应。
Constructor类:用于描述构造函数的对象
类中构造方法所对应的对象。
newInstance()
Field类:用于描述属性的对象
类中有属性--->
public class Demo01_Reflect {
public static void main(String[] args) {
// 获取Class类的对象,方法一
Person p1 = new Person();
Class c1 = p1.getClass();// Person.class
System.out.println(c1);
// 方法二:通过包名.类名的方式获取Class类的对象
try {
Class c2 = Class.forName("com.qianfeng.reflect.Person");
System.out.println(c2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 方法三:通过类名.class直接获取
Class c3 = Person.class;
System.out.println(c3);
}
}
public class Demo02_Reflect_Method {
public static void main(String[] args) throws Exception {
// 获取Person类的方法有哪些
Class c1 = Person.class;
Method[] methods = c1.getMethods();// 获取Person类中的所有方法,包含继承来的
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
System.out.println("-------------华丽丽的------------------");
Method[] methods2 = c1.getDeclaredMethods();
for (Method m : methods2) {
System.out.println("-->" + m);
}
// 练习1:获取String类所有的方法
Class c2 = Class.forName("java.lang.String");
Method[] methods3 = c2.getDeclaredMethods();
for (Method m : methods3) {
System.out.println("==>>" + m);
}
}
}
package com.qianfeng.reflect;
import java.lang.reflect.Method;
public class Demo03_Reflect_Method {
public static void main(String[] args) throws Exception {
Class c1 = Person.class;
Method[] methods = c1.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
// methods[1]
// Method getMethod(String name, Class<?>... parameterTypes)
/**
* 该方法是用于获取指定的方法:
*
* 第一个参数:Stirng methodName:方法名字
*
* 第二个参数:Class...:可变参数,传入参数的类型:Class
*/
Method m1 = c1.getMethod("fun1");
Method m3 = c1.getMethod("fun3", String.class, int.class);
Method m4 = c1.getMethod("fun4", String.class, String.class);
// 执行m1,或者m2
// Person p1=new Person();
// 获取Person类的对象
Person p2 = (Person) c1.newInstance();// 通过c1获取该类的对象
// Object invoke(Object obj, Object... args)
// 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
/**
* invoke执行方法:
*
* 谁调用:Method类的对象
*
* 第一个参数:Object obj:执行该方法的对象
*
* 第二个参数:Object ...:实参
*
* 返回值:该方法执行后的返回的结果
*/
m1.invoke(p2);
m3.invoke(p2, "张三", 30);
String result = (String) m4.invoke(p2, "二狗", "翠花,在一起");
System.out.println("我得到结果啦:" + result);
}
}
import java.lang.reflect.Constructor;
public class Demo04_Reflect_Constructor {
public static void main(String[] args) throws Exception {
Class c1 = Person.class;
Constructor[] constructors = c1.getConstructors();
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i]);
}
Constructor cc1 = c1.getConstructor(String.class, int.class);
Person p = (Person) cc1.newInstance("张三", 30);// Constructor类的newInstance()
Person p2 = (Person) c1.newInstance();// Class类的newInstance()
}
}
public class Demo05_Reflect_Filed {
public static void main(String[] args) throws Exception {
Class c1 = Person.class;
Field[] fields = c1.getDeclaredFields();
for (Field f : fields) {
System.out.println(f);
}
Field fieldName = c1.getDeclaredField("name");
Field fieldAge = c1.getDeclaredField("age");
Person p1 = (Person) c1.newInstance();
// void set(Object obj, Object value)
// 打开访问权限:private
fieldName.setAccessible(true);
fieldAge.setAccessible(true);
// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
fieldName.set(p1, "二狗");
fieldAge.set(p1, 18);
System.out.println(p1.getName() + "\t" + p1.getAge());
}
}

浙公网安备 33010602011771号