当前位置: 首页 > news >正文

泉州最专业手机网站建设开发上首页seo

泉州最专业手机网站建设开发,上首页seo,科普互联网站建设,洛可可设计公司贾伟反射概述 Java反射机制&#xff1a; 是指在运行时去获取一个类的变量和方法信息。然后通过获取的信息来创建对象&#xff0c;调用方法的一种机制。由于这种<动态性>&#xff0c;可以极大的增强程序的灵活性&#xff0c;程序不用在编译期就完成确定&#xff0c;在运行期仍…

反射概述

Java反射机制:

  • 是指在运行时去获取一个类的变量和方法信息。
  • 然后通过获取的信息来创建对象,调用方法的一种机制。
  • 由于这种<动态性>,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。

获取Class类的对象

在这里插入图片描述

案例:

//Student类
public 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}
}
public class Demo {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(c1 == c2);System.out.println("-------------------");/*通过调用对象的getClass()方法,返回对象所属类的class对象该方法是Object类中的方法,所有的Java对象都可以调用该方法*/Student stu = new Student();Class<? extends Student> c3 = stu.getClass();System.out.println(c1 == c3);System.out.println("-------------------");//使用Class类中的静态方法forName(String className),返回对象所属类的class对象Class<?> c4 = Class.forName("com.fanshe.Student");System.out.println(c1 == c4);}
}

运行结果:

class com.fanshe.Student
true
-------------------
true
-------------------
true

反射获取构造方法并使用

  • getConstructors():返回一个数组,包含该Class对象中的public公共构造函数
  • getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数
  • getConstructor(参数列表):获取指定的公共构造函数对象
  • getDeclaredConstructor(参数列表):获取指定的构造函数对象
  • newInstance(参数):构造方法创建对象
  • setAccessible(boolean flag):值为true时取消访问检查

练习:

public class Demo2 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.fanshe.Student");//getConstructors():返回一个数组,包含该Class对象中的public公共构造函数Constructor<?>[] cons = c.getConstructors();System.out.println("公共构造函数:");for (Constructor<?> con : cons) {System.out.println(con);}//getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数Constructor<?>[] dCons = c.getDeclaredConstructors();System.out.println("所有构造函数:");for (Constructor<?> dCon : dCons) {System.out.println(dCon);}System.out.println("指定的公共构造函数1:");//getConstructor():返回指定的公共构造函数的对象//参数:构造方法的参数 和 数据类型对应的字节码文件对象(Class对象)Constructor<?> con = c.getConstructor();//公共构造函数的对象使用newInstance()创建实例对象//newInstance():构造方法创建对象Object obj = con.newInstance();System.out.println(obj);System.out.println("指定的公共构造函数2:");//基本数据类型 也可以通过.class 得到对应的Class类型System.out.println(c.getConstructor(String.class, int.class, String.class).newInstance("李白",22,"西安"));System.out.println("指定的构造函数");//getDeclaredConstructor():获取指定的构造函数//参数:构造方法的参数 和 数据类型对应的字节码文件对象(Class对象)Constructor<?> dCon = c.getDeclaredConstructor(String.class);//setAccessible():值为true时取消访问检查dCon.setAccessible(true);System.out.println(dCon.newInstance("杨玉环"));}
}

运行结果:

公共构造函数:
public com.fanshe.Student(java.lang.String,int,java.lang.String)
public com.fanshe.Student()
所有构造函数:
public com.fanshe.Student(java.lang.String,int,java.lang.String)
com.fanshe.Student(java.lang.String,int)
private com.fanshe.Student(java.lang.String)
public com.fanshe.Student()
指定的公共构造函数1Student{name='null', age=0, address='null'}
指定的公共构造函数2Student{name='李白', age=22, address='西安'}
指定的构造函数
Student{name='杨玉环', age=0, address='null'}

反射获取成员变量并使用

Class类中用于获取成员变量的方法

  • getFields():获取公共的成员变量
  • getDeclaredFields():获取所有的成员变量
  • getField(成员变量):获取指定的公共成员变量
  • getDeclaredField(成员变量):获取指定的成员变量

Field类中,给成员变量赋值的方法

  • set(Object obj,Object value):给obj方法实例中的成员变量赋值

练习:

public class Demo3 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.fanshe.Student");//getFields():获取公共的成员变量Field[] fields = c.getFields();System.out.println("获取公共的成员变量:");for (Field field : fields) {System.out.println(field);}//getDeclaredFields():获取所有的成员变量Field[] df = c.getDeclaredFields();System.out.println("获取所有的成员变量:");for (Field field : df) {System.out.println(field);}System.out.println("获取指定的公共成员变量并赋值,再创建对象:");//获取指定的公共成员变量Field addressField = c.getField("address");//获取指定的公共构造方法,并创建方法实例Object obj = c.getConstructor().newInstance();//给方法中的成员变量赋值addressField.set(obj,"西安");//输出方法实例(对象)System.out.println(obj);System.out.println("获取指定的公共构造函数对象,再实例化对象:");//获取单个公共方法Constructor<?> con = c.getConstructor();//创建方法实例Object obj1 = con.newInstance();System.out.println(obj1);System.out.println("获取指定的成员变量并赋值,再实例化对象:");//获取指定的成员变量Field nameField = c.getDeclaredField("name");Field ageField = c.getDeclaredField("age");Field addField = c.getDeclaredField("address");//取消访问检查nameField.setAccessible(true);ageField.setAccessible(true);addField.setAccessible(true);//给成员变量赋值nameField.set(obj1,"胡辣汤");ageField.set(obj1,10);addField.set(obj1,"北京");//输出对象System.out.println(obj1);}
}

运行结果:

获取公共的成员变量:
public java.lang.String com.fanshe.Student.address
获取所有的成员变量:
private java.lang.String com.fanshe.Student.name
int com.fanshe.Student.age
public java.lang.String com.fanshe.Student.address
获取指定的公共成员变量并赋值,再创建对象:
Student{name='null', age=0, address='西安'}
获取指定的公共构造函数对象,再实例化对象:
Student{name='null', age=0, address='null'}
获取指定的成员变量并赋值,再实例化对象:
Student{name='胡辣汤', age=10, address='北京'}

反射获取成员方法并使用

Class类中用于获取成员方法的方法

  • getMethods():获取全部的公共成员方法数组,包含继承的方法
  • getDeclaredMethods():获取全部的成员方法数组,不包含继承的方法
  • getMethod(“方法名”,参数类型.class):获取单个公共成员方法对象
  • getDeclaredMethod(“方法名”,参数类型.class):获取单个成员方法对象

Method类中用于调用成员方法的方法

  • invoke(实体类对象,方法参数列表):调用实体类对象的成员方法

练习:

public class Demo4 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.fanshe.Student");System.out.println("获取全部的公共成员方法:");//getMethods():获取全部的公共成员方法,包含继承的方法Method[] methods = c.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println("获取全部的成员方法:");//getDeclaredMethods():获取全部的成员方法,不包含继承的方法Method[] dms = c.getDeclaredMethods();for (Method dm : dms) {System.out.println(dm);}System.out.println("获取单个的公共成员方法1:");//getMethod("方法名",参数类型.class):获取单个的公共成员方法对象Method method1 = c.getMethod("method1");//获取无参构造方法,创建实体类对象Object obj1 = c.getConstructor().newInstance();//invoke(实体类对象,方法参数列表):调用对象的成员方法method1.invoke(obj1);System.out.println("获取单个的公共成员方法2:");Method method2 = c.getMethod("method2",String.class);method2.invoke(obj1,"马超");System.out.println("获取单个的公共成员方法3:");Method method3 = c.getMethod("method3", String.class, int.class);//有返回值,先接收一下Object obj2 = method3.invoke(obj1, "赵云", 22);//输出返回结果System.out.println(obj2);System.out.println("获取单个的成员方法:");//getDeclaredMethod("方法名",参数类型):获取单个的成员方法对象Method dm = c.getDeclaredMethod("function");//取消访问检查dm.setAccessible(true);dm.invoke(obj1);}
}

运行结果:

获取全部的公共成员方法:
public java.lang.String com.fanshe.Student.toString()
public void com.fanshe.Student.method1()
public java.lang.String com.fanshe.Student.method3(java.lang.String,int)
public void com.fanshe.Student.method2(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() 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.fanshe.Student.toString()
private void com.fanshe.Student.function()
public void com.fanshe.Student.method1()
public java.lang.String com.fanshe.Student.method3(java.lang.String,int)
public void com.fanshe.Student.method2(java.lang.String)
获取单个的公共成员方法1:
method
获取单个的公共成员方法2:
method:马超
获取单个的公共成员方法3:
赵云,22
获取单个的成员方法:
function

反射练习-越过泛型检查

如何实现在ArrayList< Integer >集合中添加一个字符串数据?

public class Demo5 {public static void main(String[] args) throws Exception {//创建集合ArrayList<Integer> list = new ArrayList<>();//添加数据list.add(10);list.add(20);list.add(30);//输出集合System.out.println(list);//利用反射,在list中添加一个String数据Class<? extends ArrayList> lc = list.getClass();Method ad = lc.getMethod("add", Object.class);ad.invoke(list,"hello");//输出添加String数据后的集合System.out.println(list);}
}

运行结果:

[10, 20, 30]
[10, 20, 30, hello]

反射练习-运行配置文件指定内容

通过配置文件运行类中的方法

//老师类
public class Teacher {public void teach(){System.out.println("为师教你做人");}
}
//学生类
public class Student1 {public void study(){System.out.println("学生喜读春秋");}
}
#配置文件
className=com.fanshe.Teacher
methodName=teach
//测试类
public class Demo6 {public static void main(String[] args) throws Exception {//学生Student1 stu = new Student1();stu.study();//老师Teacher tea = new Teacher();tea.teach();System.out.println("-----配置文件实现操作-----------");//加载数据Properties pro = new Properties();FileReader fr = new FileReader("idea_test\\class.txt");pro.load(fr);fr.close();//获取配置文件中的内容String className = pro.getProperty("className");String methodName = pro.getProperty("methodName");//通过反射来使用Class<?> c = Class.forName(className);//根据无参构造方法,创建实体类对象Object obj = c.getConstructor().newInstance();//获取单个成员方法Method dm = c.getDeclaredMethod(methodName);//取消访问权限dm.setAccessible(true);//调用方法dm.invoke(obj);}
}

运行结果:

学生喜读春秋
为师教你做人
-----配置文件实现操作-----------
为师教你做人
http://www.hkea.cn/news/855090/

相关文章:

  • 做亚马逊网站费用吗曲靖新闻今日头条
  • bing 网站管理员2023今日新闻头条
  • 深圳市做网站前十强百度一下搜索网页
  • 做执法设备有哪些网站国家免费培训学校
  • 顺德乐从有做阿里巴巴的网站吗杭州网站设计
  • 做英文网站 用阿里服务器行吗b2b网站推广排名
  • 搭建网站做淘宝客网赌怎么推广拉客户
  • 网站建设前台与后台最新技术2021最新免费的推广引流软件
  • 做网站基本语言淘宝如何提升关键词排名
  • wordpress怎样分类目录添加标签seo文章范文
  • 订阅号可以做网站吗南宁seo外包服务商
  • 邢台哪儿做网站便宜宁波 seo排名公司
  • 深圳网站优化咨询网上广告怎么推广
  • 网站右击无效是怎么做的网络营销产品
  • 中宣部网站政治建设网站服务器是什么意思
  • 淮安网站定制徐州seo外包公司
  • 嘉兴类网站系统总部网站建设技术解决方案
  • 做网站的教科书外包网络推广公司推广网站
  • 模板名字 wordpress优化大师如何删掉多余的学生
  • 3d网站建设制作百度关键词优化手段
  • 新手做那些网站比较好东莞企业网站排名
  • 欧美风格网站360指数
  • 优秀网站建设公司电话下列哪些店铺适合交换友情链接
  • 58同城乌鲁木齐网站建设重庆网站到首页排名
  • wordpress知言主题山东服务好的seo公司
  • 旅游商务平台网站建设功能需求关键词排名查询官网
  • 做网站要搭建本地服务器么微商引流被加方法精准客源
  • 网站名字要备案吗友情链接怎么弄
  • 江苏网站开发外链网站大全
  • 网站代备案流程图百度关键词优化排名技巧