java反射
获得Class类的三种方法:
调用Object类的getClass()方法来得到Class对象
使用Class类的forName()静态方法获得与字符串对应的Class对象,参数字符串必须是类或接口的全限定名
使用“类型名.class”获取该类型对应的Class对象
package com;
import java.lang.reflect.Modifier;
import bean.Student;
public class GetClassInf {
public static void main(String[] args) {
try {
Class<?> f = Class.forName(“bean.Student”);
//获取全类名
String name = f.getName();
System.out.println(name);https://bean.Student
//只获取类名
String simpleName = f.getSimpleName();
System.out.println(simpleName);
//获取修饰符
int modifiers = f.getModifiers();
String string = Modifier.toString(modifiers);
System.out.println(string);
//获取父类信息 Class<?> superclass = f.getSuperclass(); System.out.println(superclass.getSimpleName()); //获取实现的接口 Class<?>[] interfaces = f.getInterfaces(); for (Class<?> class1 : interfaces) { System.out.println(class1.getSimpleName()); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //类名.class Class clazz = Student.class; //对象名.getClass(); Student student = new Student(); Class<? extends Student> clazz1 = student.getClass(); }
}
package com;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.junit.Test;
import bean.Student;
public class GetFiledInf {
//给一个普通方法 设置 Test 注解 让其执行
//要求方法必须是 公共的 无参无返回 的方法
@Test
public void test1(){
Class<?> f = null;
try {
f = Class.forName(“bean.Student”);
//通过属性的名称 获取公共的属性 这个属性可以是超类的属性 但必须是public的
Field field = f.getField(“sex”);
https://System.out.println(field);
//获取所有的公共的属性 包括 超类的公共属性
Field[] fields = f.getFields();
for (Field field2 : fields) {
// System.out.println(field2);
}
//Declared 通过属性的名称 获取本类 的 属性
//获取本类 的属性
Field declaredField = f.getDeclaredField(“name”);
// System.out.println(declaredField.getName()); //name
Field declaredField2 = f.getDeclaredField(“sex”);
int declaredField3 = f.getDeclaredField(“sid”).getModifiers();
// System.out.println(Modifier.toString(declaredField3));//privete //获取”本类“的所有的属性 declared 本类 Field[] declaredFields = f.getDeclaredFields(); for (Field field2 : declaredFields) { // System.out.println(field2); } //获取属性的 数据类型 getType() // String type = declaredField.getType().getSimpleName(); // System.out.println(type); // 获取 属性名 Field filed = f.getDeclaredField("sid"); https://System.out.println(filed); int modifiers = filed.getModifiers();//获取 sid 的访问修饰符 //String string = Modifier.toString(modifiers); https://System.out.println(string); Class<?> type = filed.getType(); https://System.out.println(string+" "+type+" "+filed.getName()); //案例 Student student = new Student(11,"张三",25,"男"); System.out.println(student); //对Student类中的sid进行取值和赋值操作 Class clazz = student.getClass(); Field fieldss = clazz.getDeclaredField("sid"); //打破封装 fieldss.setAccessible(true); Object object = fieldss.get(student); System.out.println(object); //赋值 fieldss.set(student, 100); System.out.println(student); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
package com;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import bean.Student;
public class GetMethodInf {
//获取类的方法信息
public static void main(String[] args) throws Exception { //通过方法名 获取指定的公共方法 可以是超类的方法 Class clazz = Student.class;
/* Method m1 = clazz.getMethod(“show”);
System.out.println(m1);
Method m2 = clazz.getMethod(“show”,int.class,String.class);
System.out.println(m2);
Method m3 = clazz.getMethod(“abc”);
System.out.println(m3);
System.out.println(Modifier.toString(m3.getModifiers()));*/
//获取本类中的 所有的方法 (包括 私有及非私有) //Method m1 = clazz.getDeclaredMethod("aa");//私有 https://System.out.println(m1); //获取所有的 本类中的方法 declared
/* Method[] m2 = clazz.getDeclaredMethods();
for (Method method : m2) {
System.out.println(method);
}*/
//获取方法的返回值类型
/* Method m1 = clazz.getDeclaredMethod(“show”);
Class<?> returnType = m1.getReturnType();
System.out.println(“类名”+m1.getName());
System.out.println(“返回值类型”+returnType);
*/
//获取方法的参数列表类型 //getParameterTypes() 获取方法的参数列表的类型 //getParameters() 获取方法的参数列表 //getParemeterCount() 获取方法参数的个数 Method m1 = clazz.getDeclaredMethod("show", int.class,String.class); Class<?>[] parameterTypes = m1.getParameterTypes(); for (Class<?> class1 : parameterTypes) { System.out.println(class1); } Method m2 = clazz.getDeclaredMethod("show", int.class,String.class); Parameter[] parameters = m2.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } System.out.println(); Student student = new Student(11,"张三",25,"男"); System.out.println(student); //有参无返回值 通过反射调用方法 Method method = clazz.getDeclaredMethod("setSid",int.class); method.setAccessible(true); method.invoke(student, 122); System.out.println(student); //获取有参有返回值的 Method method2 = clazz.getDeclaredMethod("a",String.class); Object invoke = method2.invoke(student, "哈哈"); System.out.println(invoke); //获取无参无返回 Method method3 = clazz.getDeclaredMethod("b"); Object invoke2 = method3.invoke(student); System.out.println(invoke2); //获取无参有返回 Method method4 = clazz.getDeclaredMethod("c"); Object invoke3 = method4.invoke(student); System.out.println(invoke3); }
}
package com;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import org.junit.Test;
import bean.Student;
public class GetConstractorInf {
//给一个普通方法设置 Test 注解 让其 执行
//要求方法 必须是 公共的 无参无返回的方法
@Test
public void test1() throws Exception{
Student student = new Student();
Class<? extends Student> clazz = student.getClass();
// 获取 类的公共构造器
/* Constructor<? extends Student> c = clazz.getConstructor();
System.out.println©;
//通过构造的参数获取构造器
Constructor<? extends Student> c1 = clazz.getConstructor(int.class);
System.out.println(c1);
Constructor<? extends Student> c2 = clazz.getConstructor(int.class,String.class,double.class,String.class);
System.out.println(c2);/
//获取 指定参数的构造器可以是私有的
/ Constructor<? extends Student> constructor2 = clazz.getDeclaredConstructor(int.class,String.class);
System.out.println(constructor2);/
//获取所有的公共的构造器
/ Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}*/
// 获取所有的私有的构造器
/* Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor<?> constructor : declaredConstructors) {
System.out.println(constructor);
}/
//获取 构造器的修饰符 首先要获取一个构造器
/ Constructor<? extends Student> c = clazz.getConstructor(int.class,String.class,double.class,String.class);
int modifiers = c.getModifiers();
System.out.println(Modifier.toString(modifiers));
//获取 构造器的参数列表
Class<?>[] parameterTypes = c.getParameterTypes();
for (Class<?> class1 : parameterTypes) {
System.out.println(class1.getSimpleName());
}*/
//通过构造器 创建对象
Constructor<? extends Student> c = clazz.getConstructor(int.class,String.class,double.class,String.class);
Student newInstance = c.newInstance(11,“小王”,12.1,“男”);
System.out.println(newInstance);
// 注意: 其实 class 对象也有 newInstance 方法 不过调用的是 无参构造器 Object newInstances = clazz.newInstance(); System.out.println(newInstances); }
}
- Java反射经典实例 Java Reflection Cookbook (转)
- java反射详解。。。
- JAVA-反射学习(3)
- Java 反射机制
- java 反射详解
- Java反射(reflect)
- JAVA的内省(introspector)与反射(reflection)
- Java反射(五)-Java 方法反射的基本操作
- 学习Spring必学的Java基础知识(1)----反射
- java反射详解
- 黑马程序员_JAVA基础加强——反射
- Java反射学习
- java反射获取类的信息
- Java 反射、注解
- java反射:建立框架
- java反射
- java——反射
- 大白话说Java反射:入门、使用、原理
- java反射几个方法
- java基础反射