您的位置:首页 > 编程语言 > Java开发

java反射

2019-04-14 16:01 323 查看

获得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);
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: