发布于2021-05-29 20:50 阅读(942) 评论(0) 点赞(20) 收藏(2)
class Student{
//成员变量:一个私有,一个默认,一个公共
private String name;
int age;
public String address;
//构造方法:一个私有,一个默认,一个公共
public Student() {
}
private Student(String name) {
this.name = name;
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
//成员方法:一个私有,四个公共
private void function(){
System.out.println("function");
}
public void method1(){
System.out.println("method");
}
public void method2(String s){
System.out.println("method:"+s);
}
public String method3(String s,int i){
return s +"," +i;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
//测试
public class ReflectDemo{
public static void main(String[] args) throws ClassNotFoundException {
//使用类的class属性来获取该类对应的Class对象
Class<Student> c1 = Student.class;
System.out.println(c1);
Class<Student> c2 = Student.class;
System.out.println(c2==c1);//true
System.out.println("---------");
//调用对象的getClass()方法,返回该对象所属类对应的Class对象
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
System.out.println(c1==c3);//true
//使用Class类中的静态方法forName(String className)
Class<?> c4 = Class.forName("com.tao.Student");
System.out.println(c1==c4);//true
}
}
Constructor<?>[] getConstructors()
:返回所有公共构造方法对象的数组public class ReflectDemo{
public static void main(String[] args) throws ClassNotFoundException {
//获取反射对象
Class<?> c = Class.forName("com.tao.Student");
//Constructor<?>[] getConstructors()返回一个包含Constructor对象的数组,
//Constructor对象反映了由该Class对象表示的类的所有公共构造函数
Constructor<?>[] cons = c.getConstructors();
for (Constructor<?> con : cons) {
System.out.println(con);
}
}
}
运行结果:
下面的构造方法都是公共的
public com.tao.Student(java.lang.String,int,java.lang.String)//有三个参数的构造
public com.tao.Student()//无参构造方法
Constructor<?>[] getDeclaredConstructors()
:返回所有构造方法对象的数组public class ReflectDemo{
public static void main(String[] args) throws ClassNotFoundException {
//获取反射对象
Class<?> c = Class.forName("com.tao.Student");
//Constructor<?>[] getDeclaredConstructors()返回反映由该Class对象表示的类声明的所有构造函数的Constructor对象的数组
Constructor<?>[] cons = c.getDeclaredConstructors();
for (Constructor<?> con : cons) {
System.out.println(con);
}
}
}
运行结果:
public com.tao.Student(java.lang.String,int,java.lang.String)
com.tao.Student(java.lang.String,int)
private com.tao.Student(java.lang.String)
public com.tao.Student()
Constructor<T> getConstructor(Class<?>... parameterTypes)
:返回单个公共构造方法对象Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
:返回单个构造方法对象T newInstance(Object... initargs)
:根据指定的构造方法创建对象public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取反射对象
Class<?> c = Class.forName("com.tao.Student");
//参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象
//Constructor<T> getConstructor (Class<?>... parameterTypes) 返回一个Constructor对象,该对象反映由该Class对象表示的类的指定的公共构造函数
Constructor<?> con = c.getConstructor();//不填表示获取无参构造方法
//Constructor提供了一个类的单个构造函数的信息和访问权限
//T newInstance(Object... initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例
Object obj = con.newInstance();//不填表示获取无参构造方法
System.out.println(obj);//Student{name='null', age=0, address='null'}
//Constructor<T> getDeclaredConstructor (Class<?>... parameterTypes) 返回一个Constructor对象,该对象反映由该Class对象表示的类或接口的指定的构造函数
Constructor<?> con1 = c.getDeclaredConstructor();
Object obj1 = con1.newInstance();
System.out.println(obj1);//Student{name='null', age=0, address='null'}
}
}
public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.tao.Student");
//public Student(String name,int age, String address)
//Constructor<T> getConstructor(Class<?>... parameterType)
Constructor<?> con = c.getConstructor(String.class, int.class, String.class);
//基本数据类型也可以通过.class类型
//T newInstance(Object... initargs)
Object obj = con.newInstance("林青霞", 30, "西安");
System.out.println(obj);//Student{name='林青霞', age=30, address='西安'}
}
}
public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.tao.Student");
//public Student(String name)
//Constructor<T> getDeclaredConstructor(Class<?>... parameterType)
Constructor<?> con = c.getDeclaredConstructor(String.class);
//暴力反射
//public void setAccessible(boolean flag):值为引true,去校访问检查
con.setAccessible(true);//可以使用私有的构造方法创建对象
Object obj = con.newInstance("林青霞");
System.out.println(obj);//Student{name='林青霞', age=0, address='null'}
}
}
Field[] getFields()
:返回所有公共成员变量对象的数组Field[] getDeclaredFields()
:返回所有成员变量对象的数组Field getField(String name)
:返回单个公共成员变量对象Field getDeclaredField(String name)
:返回单个成员变量对象void set(Object obj, Object value)
:给obj对象的成员变量赋值为value//反射获取成员变量
public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.tao.Student");
//Filed[] getFields()返回一个包含Field对象反映由该Class对象表示的类或接口的所有可访问的公共字段
Field[] fields = c.getFields();
for (Field field : fields) {
System.out.println(field);//public java.lang.String com.tao.Student.address
}
System.out.println("----------------------------");
//Field[] getDeclaredField()返回一个Field对象的数组,反映了由该Class对象表示的类或接口声明的所有字段
Field[] declaredFields = c.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("----------------------------");
//Field[] getField(String name)返回一个Field对象,该对象表示的类或接口的指定公共成员字段
Field addressField = c.getField("address");
//获取无参构造方法创建对象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
//Field提供有关类或接口的单个字段的信息和动态访问
//Field[] getDeclaredField(String name)返回一个Field对象,该对象表示的类或接口的指定声明字段
//void set(Object obj,Object value)将指定的对象参数中由此Field对象表示的字段设置为指定的新值
addressField.set(obj,"西安");//给obj的成员变量addressField赋值为西安
System.out.println(obj);
}
}
public java.lang.String com.tao.Student.address
----------------------------
private java.lang.String com.tao.Student.name
int com.tao.Student.age
public java.lang.String com.tao.Student.address
----------------------------
Student{name='null', age=0, address='西安'}
Student s = new Student();
s.name = "林青霞";
s.age = 30;
s.address = "西安";
System.out.println(s);
public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.tao.Student");
//Student s = new Student();
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);//Student{name='null', age=0, address='null'}
//s.name="林青霞"
Field nameField = c.getDeclaredField("name");
nameField.setAccessible(true);//取消访问检查
nameField.set(obj,"林青霞");
System.out.println(obj);//Student{name='林青霞', age=0, address='null'}
//s.age=30
Field ageField = c.getDeclaredField("age");
ageField.set(obj,30);
System.out.println(obj);//Student{name='林青霞', age=30, address='null'}
//s.address="西安"
Field addressField = c.getDeclaredField("address");
addressField.set(obj,"西安");
System.out.println(obj);//Student{name='林青霞', age=30, address='西安'}
}
}
Method[] getMethods()
:返回所有公共成员方法对象的数组,包括继承的Method[] getDeclaredMethods()
:返回所有成员方法对象的数组,不包括继承的Method getMethod(String name, Class<?>... parameterTypes)
:返回单个公共成员方法对象Method getDeclaredMethod(String name, Class<?>... parameterTypes)
:返回单个成员方法对象Object invoke(Object obj, Object... args)
:调用obj对象的成员方法,参数是args,返回值是Object类型//反射获取成员方法并使用
public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.tao.Student");
//Method[] getMethods()返回一个包含方法对象的数组,方法对象反映由该Class对象表示的类或接口的所有公共方法,包括由类或接口声明的对象以及从超类和超级接口继承的类
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("------------------------------");
//Method[] getDeclaredMethods()返回一个包含方法对象的数组,方法对象反映由该Class对象表示的类或接口的所有声明方法,包括public、protected、default(package)访问和私有方法
Method[] declaredMethods = c.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
System.out.println("-------------------------------");
//Method getMethod(String name,Class<?>... parameterTypes)返回会一个方法对象,该对象反映由该CLass对象表示的类或接口的指定公共成员方法
Method method = c.getMethod("method1");
//获取无参构造方法对象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
//通过对象调用方法
//在类或接口上提供有关单一方法的信息和访问权限
//Object invoke(Object obj,Object... args)在具有指定参数的指定对象上调用此方法对象表示的基础方法
//Object:返回值类型
//obj:调用方法的对象
//args:方法需要的参数
method.invoke(obj);
//Method getDeclaredMethod(String name,Class<?>... parameterTypes)返回会一个方法对象,它反映此表示的类或接口的指定声明的方法Class对象
Method declaredMethod = c.getDeclaredMethod("method3", String.class, int.class);
System.out.println(declaredMethod);
}
}
public java.lang.String com.tao.Student.toString()
public java.lang.String com.tao.Student.method3(java.lang.String,int)
public void com.tao.Student.method2(java.lang.String)
public void com.tao.Student.method1()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
------------------------------
public java.lang.String com.tao.Student.toString()
private void com.tao.Student.function()
public java.lang.String com.tao.Student.method3(java.lang.String,int)
public void com.tao.Student.method2(java.lang.String)
public void com.tao.Student.method1()
-------------------------------
method
public void com.tao.Student.method1()
public java.lang.String com.tao.Student.method3(java.lang.String,int)
public class ReflectDemo{
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.tao.Student");
//Student s = new Student();
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
//s.method1()
Method m1 = c.getMethod("method1");
m1.invoke(obj);//method
//s.method2
Method m2 = c.getMethod("method2", String.class);
m2.invoke(obj,"林青霞");//method:林青霞
//String ss = s.method3("林青霞",30)'
//System.out.println(ss)
Method m3 = c.getMethod("method3", String.class, int.class);
Object o = m3.invoke(obj, "林青霞", 30);
System.out.println(o);//林青霞,30
//s.function()
Method m4 = c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(obj);//function
}
}
import java.lang.reflect.Method;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) throws Exception {
//创建集合
ArrayList<Integer> array = new ArrayList<>();
Class<? extends ArrayList> c = array.getClass();
Method m = c.getMethod("add", Object.class);
m.invoke(array,"hello");
m.invoke(array,"world");
m.invoke(array,"java");
//反射可以越过泛型的检查,获取到原始的方法所需要的参数类型
System.out.println(array);//[hello, world, java]
}
}
className=com.tao.Student
methodName=study
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;
class Student{
public void study(){
System.out.println("好好学习天天向上");
}
}
class Teacher{
public void teach(){
System.out.println("用爱成就学生");
}
}
public class Demo {
public static void main(String[] args) throws Exception {
/*
在class.txt中配置我们要使用的类,以及类中的方法
className=xxx
methodName=xxx
*/
//加载数据
Properties prop = new Properties();
FileReader fr = new FileReader("qfnu\\class.txt");
prop.load(fr);
fr.close();
String className = prop.getProperty("className");
String methodName = prop.getProperty("methodName");
//通过反射使用
Class<?> c = Class.forName(className);
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
Method m = c.getMethod(className);
m.invoke(obj);
}
}
作者:飞向远方
链接:http://www.javaheidong.com/blog/article/207201/e3e0aa973d9f7346bba3/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!