博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射
阅读量:5045 次
发布时间:2019-06-12

本文共 12699 字,大约阅读时间需要 42 分钟。

           冰叔现在还在公司,虽然我是一个实习生,但是也能明白程序员为什么那么晚睡,也许有的人是为了自己的梦想,而有的人却是为了其他人的梦想,现在的的世界有着数不清的程序,但是好的程序却没几个。有的软件即使用的人很少但是他依旧很美。我经常晚上行走在城市中,自己感觉晚上的城市是最美的,它没有了白天的嘈杂,没有白天的拥挤,剩下的就是蟋蟀的叫声,和偶尔的汽车声,最美的还是城市的灯光了。

           冰叔总爱写写心情,如果大家不愿意看的话可以和我说,我可以写在我的日记里。

          不多说了,今天我学习了反射顺便把自己写的代码放在这里。方便大家查看,最好学习一下这些东西。

 

一、目录结构。

二、Demo文件

package com.xxx.demo;import com.sun.xml.internal.ws.api.model.ExceptionType;import com.xxx.handler.MyInvocationHandler;import com.xxx.pojo.Person;import com.xxx.service.UserService;import com.xxx.service.impl.UserServiceImpl;import org.junit.Test;import java.lang.reflect.*;import java.util.ArrayList;import java.util.List;/** * @Author:hsj * @Date:15:32 2017/7/27 * @Description:java反射机制的学习 */public class Demo {    //该方法通过反射得到类名和完整包名    @Test    public void fun() {        Person p = new Person();       //创建了一个对象        System.out.println(p.getClass().getName());    }    //实例化class类对象    @Test    public void fun2() throws Exception {        Class
class2 = null; Class
class3 = null; Class
class4 = null; //一般采用这种形式 class2 = Class.forName("com.xxx.pojo.Person"); class3 = new Person().getClass(); class4 = Person.class; System.out.println("类名称 " + class2.getName()); System.out.println("类名称 " + class3.getName()); System.out.println("类名称 " + class4.getName()); } //获取一个对象的父类与实现接口 @Test public void fun3() throws Exception { Class
class2 = Class.forName("com.xxx.pojo.Student"); //得到一个对象 Class
parentClass = class2.getSuperclass(); System.out.println(class2.getSuperclass().getName()); //得到父类的完整类名 Class
class3 = Class.forName("com.xxx.service.impl.UserServiceImpl"); Class
inters[] = class3.getInterfaces(); for (int i = 0; i < inters.length; i++) { System.out.println(inters[i].getName()); } } //获取某个类的所有构造函数 @Test public void fun4() throws Exception { Class
class2 = Class.forName("com.xxx.pojo.Person"); Class
class3 = Class.forName("com.xxx.pojo.Student"); //第一种方式通过反射实例化一个对象 Person p = (Person) class2.newInstance(); p.setAge(20); p.setName("hsj"); p.setHeight(175); p.setSex("男"); System.out.println(p); Constructor
cons[] = class2.getConstructors(); //得到所有构造函数 for (int i = 0; i < cons.length; i++) { Class
clazz[] = cons[i].getParameterTypes(); //得到参数类型 System.out.print("cons[" + i + "]("); for (int j = 0; j < clazz.length; j++) { if (j == clazz.length - 1) { System.out.print(clazz[j].getName()); } else { System.out.print(clazz[j].getName() + ","); } } System.out.println(")"); } Person p2 = (Person) cons[0].newInstance("hsj", 20, "男", 175); Person p3 = (Person) cons[1].newInstance("hsj", 20, "男"); Person p4 = (Person) cons[2].newInstance("hsj"); System.out.println(p2); System.out.println(p3); System.out.println(p4); } //获取某个类的全部属性 @Test public void fun5() throws Exception { System.out.println("===============本类属性==============="); Class
tClass = Class.forName("com.xxx.pojo.Person"); Class
tClass2 = Class.forName("com.xxx.pojo.Student"); Field[] declaredFields = tClass.getDeclaredFields(); //获取所有字段 for (int i = 0; i < declaredFields.length; i++) { int modifiers = declaredFields[i].getModifiers(); //修饰符 String priv = Modifier.toString(modifiers); //修饰符 Class
type = declaredFields[i].getType(); //字段类型 System.out.println(priv + " " + type.getName() + " " + declaredFields[i].getName() + ";"); } System.out.println("===============实现的接口或者父类属性==============="); Field[] fields = tClass2.getFields(); //此方法只能获取public的字段 for (int j = 0; j < fields.length; j++) { int modifiers = fields[j].getModifiers(); //返回修饰符对应的整数 String modifier = Modifier.toString(modifiers); //得到修饰符 Class
type = fields[j].getType(); System.out.println(modifier + " " + type.getName() + " " + fields[j].getName() + ";"); } } //获取某个类的全部方法 @Test public void fun6() throws Exception { Class
class2 = Class.forName("com.xxx.service.impl.UserServiceImpl"); Method[] methods = class2.getMethods(); //得到所有方法 for (Method m : methods) { int mo = m.getModifiers(); //修饰符 String modifie = Modifier.toString(mo); Class
returnType = m.getReturnType();//得到返回值类型 Parameter[] parameters = m.getParameters(); System.out.print(modifie + " "); System.out.print(returnType.getName() + " "); System.out.print(m.getName() + "("); for (int i = 0; i < parameters.length; i++) { System.out.print(parameters[i].getName() + " " + "arg" + i); if (i < parameters.length - 1) { System.out.print(","); } } Class
[] exceptionTypes = m.getExceptionTypes(); //得到异常 if (exceptionTypes.length > 0) { System.out.print(") throws "); for (int i = 0; i < exceptionTypes.length; i++) { System.out.print(exceptionTypes[i].getName()); if (i < exceptionTypes.length - 1) { System.out.print(","); } } } else { System.out.print(")"); } System.out.println(""); } } //通过反射调用方法 @Test public void fun7() throws Exception { Class
clazz = Class.forName("com.xxx.service.impl.UserServiceImpl"); Method method = clazz.getMethod("addUser"); //根据名字的到方法 method.invoke(clazz.newInstance()); //调用方法 Method hello = clazz.getMethod("hello", String.class, int.class); Object hsj = hello.invoke(clazz.newInstance(), "hsj", 20); System.out.println(hsj.toString()); } //通过反射操作某个类的属性 @Test public void fun8() throws Exception { Class
class2 = Class.forName("com.xxx.pojo.Person"); Object obj = class2.newInstance(); Field name = class2.getDeclaredField("name"); Field age = class2.getDeclaredField("age"); name.setAccessible(true); age.setAccessible(true); name.set(obj, "hsj"); age.set(obj, 20); System.out.println(name.get(obj)); System.out.println(age.get(obj)); } //反射机制的动态代理 @Test public void fun9() { MyInvocationHandler demo = new MyInvocationHandler(); UserService userService = (UserService) demo.bind(new UserServiceImpl()); userService.addUser(); } //在泛型为Integer的ArrayList中存放一个String类型的对象。 @Test public void fun10() throws Exception { List
list = new ArrayList<>(); Method method = list.getClass().getMethod("add", Object.class); method.invoke(list, "生命在于运动!"); System.out.println(list.get(0)); } //通过反射获得并修改数组信息 @Test public void fun11() { int[] array = {1, 2, 3, 4, 5, 6, 7}; Class
demo = array.getClass().getComponentType(); System.out.println("数组的类型" + demo.getName()); System.out.println("数组长度 " + Array.getLength(array)); System.out.println("数组的第一个元素 " + Array.get(array, 0)); Array.set(array, 0, 100); System.out.println("修改数组的元素:" + Array.get(array, 0)); } //通过反射修改数组的大小 @Test public void fun12() { int[] temp={1,2,3,4,5,6,7}; int[] newtemp=(int[]) arrayInc(temp,15); print(newtemp); String[] str={"a","b","c"}; String[] str2=(String[]) arrayInc(str,8); print(str2); } //修改数组的大小 public static Object arrayInc(Object obj, int len) { Class
arr = obj.getClass().getComponentType(); // Object newArr = Array.newInstance(arr, len); int co=Array.getLength(obj); System.arraycopy(obj,0,newArr,0,co); return newArr; } //打印 public static void print(Object obj){ Class
c=obj.getClass(); if(!c.isArray()){ return; } System.out.println("数组的长度:"+Array.getLength(obj)); for (int i = 0; i

 

MyInvocationHandler文件
package com.xxx.handler;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @Author:hsj * @Date:15:30 2017/7/28 * @Description: */public class MyInvocationHandler implements InvocationHandler {    private Object obj=null;    public Object bind(Object obj){        this.obj=obj;        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object temp=method.invoke(this.obj,args);        return temp;    }}/** * 在java中有三种类类加载器。 * * 1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。 * * 2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jrelibext目录中的类 * * 3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。 * * 如果想要完成动态代理,首先需要定义一个InvocationHandler接口的子类,已完成代理的具体操作。 * * @author xsoftlab.net * */

Person文件

package com.xxx.pojo;/** * @Author:hsj * @Date:15:35 2017/7/27 * @Description:这是一个实体类 */public class Person {    private String name;      //姓名    private int age;          //年龄    private String sex;       //性别    private double height;    //身高    public double money;    public Person() {    }    public Person(String name) {        this.name = name;    }    public Person(String name, int age, String sex) {        this.name = name;        this.age = age;        this.sex = sex;    }    public Person(String name, int age, String sex, double height) {        this.name = name;        this.age = age;        this.sex = sex;        this.height = height;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public double getHeight() {        return height;    }    public void setHeight(double height) {        this.height = height;    }    //重写toString    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                ", sex='" + sex + '\'' +                ", height=" + height +                '}';    }}

Student文件

package com.xxx.pojo;import java.io.Serializable;/** * @Author:hsj * @Date:16:12 2017/7/27 * @Description:这是一个学生类继承了学生接口 */public class Student extends Person implements Serializable {    private String stuNo;     //这是学号    public double score;      //分数    //空构造函数    public Student(){    }    //构造函数    public Student(String stuNo) {        super();        this.stuNo = stuNo;    }    public String getStuNo() {        return stuNo;    }    public void setStuNo(String stuNo) {        this.stuNo = stuNo;    }    //说英语方法    public void sayEnglish(){        System.out.println("I am a student i love say english , aare you ok?");    }    //重写toString    @Override    public String toString() {        System.out.println("I am a student");        return "you are very good";    }}

UserService文件

package com.xxx.service;/** * @Author:hsj * @Date:16:17 2017/7/27 * @Description:这是一个UserService接口 */public interface UserService {    //添加用户    void addUser();    //修改用户    void uodateUser();    //查找用户    void findUser();    //删除用户    void deleteUser();}

UserServiceImpl文件

package com.xxx.service.impl;import com.xxx.service.UserService;import java.io.Serializable;/** * @Author:hsj * @Date:16:20 2017/7/27 * @Description:这是UserService的实现类 */public class UserServiceImpl implements UserService, Serializable {    @Override    public void addUser() {        System.out.println("成功添加了一个用户");    }    @Override    public void uodateUser() {        System.out.println("用户信息修改成功");    }    @Override    public void findUser() {        System.out.println("成功查找到该用户");    }    @Override    public void deleteUser() {        System.out.println("删除成功");    }    private void sum() {        System.out.println("这是一个统计数据使用的内部方法");    }    public String hello(String name, int age) {        System.out.println("我是:" + name + "   年龄:" + age);        return "i am a student";    }}

 

转载于:https://www.cnblogs.com/bingshu/p/7252995.html

你可能感兴趣的文章
JQuery_004_触发事件
查看>>
iOS开发(Objective-C)常用库索引
查看>>
[源码和文档分享]基于C#和SQL SERVER的校园知识问答论坛网站的设计与实现
查看>>
面向对象基础项目----图书管理系统(数组)
查看>>
BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]
查看>>
BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 [LCT]
查看>>
ubuntu15.10安装搜狗拼音输入法
查看>>
低调发布一个百度谷歌关键字搜索工具
查看>>
js函数的节流与防抖
查看>>
Web系列:网页版超级计算器,仿百度搜索框,仿百度视频选项卡
查看>>
Redis的架构以及有关事务使用场景
查看>>
LeetCode Reverse Words in a String II
查看>>
安卓开发之调用摄像头、相册
查看>>
IT职场人生系列之十四:经验积累
查看>>
01011_怎么打开任务管理器?win7打开任务管理器方法
查看>>
用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件
查看>>
服务器端异步接受SOKCET请求
查看>>
联玛客(T 面试)
查看>>
JQ实现弹幕效果
查看>>
0909上机作业
查看>>