java中的反射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java中的反射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2689字,纯文字阅读大概需要4分钟。
内容图文
![java中的反射](/upload/InfoBanner/zyjiaocheng/801/0aecd9baa6924c02b59a7f0ff5f47357.jpg)
反射指动态获取类及类中的内容
示例代码:String className = "cn.itheima.web.servlet.MyServletImpl";
Class clazz = Class.forName(className);
MyServletImpl my = (MyServletImpl) clazz.newInstance();
如何获取类的Class对象(字节码文件)?
1,通过Object类的getClass() 方法 ,需要先创建对象 -----比较两个文件是否为同一个字节码文件
2,通过Class的静态属性 .class 获取 -----锁对象
3,通过Class的静态方法,Class.forName( )方法获取 ----读取配置文件
如何获取Class对象所对应的类的构造方法?
1,无参构造,可以直接用newInstance( )来创建对象
2,有参构造,可以用 getConstructor( )来获取构造方法,(括号里不传入参数是获取无参构造方法,传入参数是获取有参构造)再使用newInstance( )来创建对象
代码演示如下:
Class clazz = Class.forName("Bean.Person"); //获取Person类的Classd对象
Constructor constructor = clazz.getConstructor(String.class, int.class); //(反射阶段) 获取有参构造,不传入参数则是获取无参构造
Person p = (Person) constructor.newInstance("张三", 23); // 根据有参构造创建实例
System.out.println(p);
如何获取Class对象所对应的类或接口的定义的变量,字段?
1,如是公共变量,可以在获取Class对象后,调用getField(String ?)获取
2,如是私有变量,可以在获取Class对象后,调用getDeclaredField(Sting ?)暴力获取 声明的变量,如需改变其值,则需用,setAccessible(ture)去除私有权限
Class clazz = Class.forName("Bean.Person"); //获取Person类的Classd对象
Constructor constructor = clazz.getConstructor(String.class, int.class);
Person p = (Person) constructor.newInstance("张三", 23); // 根据有参构造创建实例
//Field field = clazz.getField("name"); //获取公共变量
Field declaredField = clazz.getDeclaredField("name");
declaredField.setAccessible(true);//去除私有属性
declaredField.set(p, "李四");
System.out.println(p);
如何获取Class对象对应的类或接口中的方法?
1,公共方法,getMethod( )
2,私有方法,getDeclaredMethod( )
Class clazz = Class.forName("Bean.Person"); //获取Person类的Classd对象
Object p = clazz.newInstance();
Method method = clazz.getMethod("play",int.class);//反射阶段
method.invoke(p, 5);
通过反射越过泛型检查:
package Reflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.omg.CORBA.INTERNAL;
public class demo6_test1 {
// 通过反射越过越过泛型检查(泛型检擦只在编译器,在运行期,反射阶段可以跳过检查)
public static void main(String[] args) throws Exception {
ArrayList<Integer> al = new ArrayList<>();
al.add(11);
Class<?> clazz = Class.forName("java.util.ArrayList");
Method method = clazz.getDeclaredMethod("add", Object.class);// ArrayList类里的add方法里的原有的参数类型是Object
method.invoke(al, "abc");
System.out.println(al);
}
}
内容总结
以上是互联网集市为您收集整理的java中的反射全部内容,希望文章能够帮你解决java中的反射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。