我是靠谱客的博主 潇洒水池,最近开发中收集的这篇文章主要介绍Java中能反射接口类吗,java中的反射,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

反射指动态获取类及类中的内容

示例代码: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);

163629762_1_20190614094052500

如何获取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);

163629762_1_20190614094052500

如何获取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);

163629762_1_20190614094052500

通过反射越过泛型检查:

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 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);

}

}

163629762_1_20190614094052500注意:我印象中记得不能通过反射获取父类中的私有方法,要获取需要递归通过getSuperClass()获取父类字节码,参考这篇博文来源:http://www.icode9.com/content-1-249201.html

最后

以上就是潇洒水池为你收集整理的Java中能反射接口类吗,java中的反射的全部内容,希望文章能够帮你解决Java中能反射接口类吗,java中的反射所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部