反射

难点总结:

1.例子入手

package test;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;public class ListToModel {public static void main(String[] args) {List<Object> userList = new ArrayList<Object>();userList.add("tom");userList.add("男");userList.add(18);User user = new User();try {listToModel(userList, user);} catch (Exception e) {e.printStackTrace();}System.out.println(user.getName() + "; " + user.getGender() + "; " + user.getAge());}//把list内容逐个取出来放进User实体类中public static <T> void listToModel(List<Object> list, T t) throws Exception {Field[] fields = t.getClass().getDeclaredFields();if (list.size() != fields.length) {return;}for (int k = 0, len = fields.length; k < len; k++) {// 根据属性名称,找寻合适的set方法String fieldName = fields[k].getName();String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);Method method = null;Class<?> clazz = t.getClass();try {method = clazz.getMethod(setMethodName, new Class[] { list.get(k).getClass() });System.out.println("list.get("+k+").getClass():"+list.get(k).getClass());} catch (SecurityException e1) {e1.printStackTrace();return;} catch (NoSuchMethodException e1) {String newMethodName = "set" + fieldName.substring(0, 1).toLowerCase()+ fieldName.substring(1);try {method = clazz.getMethod(newMethodName, new Class[] { list.get(k).getClass() });} catch (SecurityException e) {e.printStackTrace();return;} catch (NoSuchMethodException e) {e.printStackTrace();return;}}if (method == null) {return;}method.invoke(t, new Object[] { list.get(k) });}}}
class User{private String name;private String gender;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2. Object.getClass()方法是啥?

作用

拿到反射的类

例子

User user = new User();
System.out.println(user.getClass());

控制台打印结果

class test.User

3. getDeclaredFields()

作用

拿到所有声明的成员变量集合,无论public还是private,当然是Field[] fields

例子

4. getMethod()

作用

Method Class.getMethod(String name, Class<?>… parameterTypes)的作用是获得对象所声明的公开方法

该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型,白话就是原来那个函数的参数s写成数组。
返回结果是 Method method

例子

method = clazz.getMethod(setMethodName, new Class[] {list.get(k).getClass()});
System.out.println("method:"+method);

结果:

method : public void month8day16.User.setGender(java.lang.String)

5. method.invoke()

作用

public Object invoke(Object obj, Object... args)
obj - 调用底层方法的对象。就是执行方法的对象
args - 用于方法调用的参数。就是方法要用到的实际参数

例子

method.invoke(t, new Object[] {list.get(k)})

上面的method是user的set方法,将值放入方法中,确实get得到值


date:2022/03/01

啥是反射

动态语言可以运行时改变自身结构
java通过反射可以变为准动态语言,但也增加了不安全性。
Class类用来管理反射。

应用

动态代理
在运行时判断对象所属的类
在运行时构造一个类的对象
在运行时判断一个类所有的变量和方法
在运行是调用一个对象的方法

优缺点

优点:可以动态创建编译对象
缺点:性能较弱。反射是一种解释操作,让jvm来操作。

Class类

每个类编译完成时候,都会产生Class对象。
反射获取类实际例子,一般有三种方式
1.Class.forname(“类路径”);
2.Class classTest = 目标类.class
3.Class classTest = 目标类实例对象.getClass()

类加载步骤:

  • 1.方法区里面加载一个类对应Class对象
  • 2.然后程序栈里面进行link过程
  • 3.初始化

通过reflection获得一个对象

例子:

package com.day301.reflectiondemo;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test09 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {Class c1 =Class.forName("com.day301.reflectiondemo.Userme");Constructor constuctor = c1.getDeclaredConstructor(String.class,int.class,double.class);//通过构造器调用对象有参构造方法,生成对象Userme user01 = (Userme) constuctor.newInstance("shi",01,59.63);System.out.println(user01.getAge());Userme c2 = (Userme)c1.newInstance();System.out.println(c2);//默认生成无参构造方法Method method = c1.getDeclaredMethod("setAge", double.class);method.invoke(c2, 37.09);System.out.println(c2.getAge());//返回一个method,注意的是,需要将方法invoke初始化Userme c3 = (Userme)c1.newInstance();Field name =c1.getDeclaredField("name");name.setAccessible(true);name.set(c3, "我要调用方法"+ "没错哦");System.out.println(c3.getName());
//update field方法,需要注意的是,需要添加setAccessible(True),private filed才能修改
}
}

结果:

59.63
com.day301.reflectiondemo.Userme@3dfc5fb8
37.09
我要调用方法没错哦

性能

package com.day301.reflectiondemo;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test10 {public static void test01(){Userme user = new Userme();long starttime =System.currentTimeMillis();for(int i=0;i<1000000000;i++) {user.getName();}long endTime =System.currentTimeMillis();System.out.println("默认方法"+(starttime-endTime)+"ms");}public static void test02() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{Userme user = new Userme();Class c1 =user.getClass();Method getName =c1.getDeclaredMethod("getName", null);long starttime =System.currentTimeMillis();for(int i=0;i<1000000000;i++) {getName.invoke(user, null);        }long endTime =System.currentTimeMillis();System.out.println("这是正常反射操时间:                          "+(starttime-endTime)+"ms");}public static void test03() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{Userme user = new Userme();Class c2 =user.getClass();Method getName =c2.getDeclaredMethod("getName", null);getName.setAccessible(true);long starttime =System.currentTimeMillis();for(int i=0;i<1000000000;i++) {getName.invoke(user, null);  }long endTime =System.currentTimeMillis();System.out.println(starttime-endTime+"ms");}public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {test01();test02();test03();}
}

结果:

默认方法-3ms
这是正常反射操时间:                          -1196ms
-868ms

泛型

public class TestFanxing {public void test01(Map<String , Userme> map,List<Userme> list) {System.out.println("调用了Test01方法");}public Map<String ,Userme> test02(){System.out.println("调用了Test02方法");return null;    }public static void main(String[] args) throws NoSuchMethodException, SecurityException {{Method method = TestFanxing.class.getMethod("test01", Map.class,List.class);System.out.println(method);Type[] genericParameterTypes = method.getGenericParameterTypes();for(Type genericParameterType : genericParameterTypes) {System.out.println(genericParameterType);if(genericParameterType instanceof ParameterizedType){Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();for(Type actual:actualTypeArguments) {System.out.println(actual);}}}}{Method method2 = TestFanxing.class.getMethod("test02", null);System.out.println(method2);Type[] genericParameterTypes = method2.getGenericParameterTypes();for(Type genericParameterType : genericParameterTypes) {System.out.println(genericParameterType);if(genericParameterType instanceof ParameterizedType){Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();for(Type actual:actualTypeArguments) {System.out.println(actual);}}}}}
}
public void com.day301.reflectiondemo.TestFanxing.test01(java.util.Map,java.util.List)
java.util.Map<java.lang.String, com.day301.reflectiondemo.Userme>
class java.lang.String
class com.day301.reflectiondemo.Userme
java.util.List<com.day301.reflectiondemo.Userme>
class com.day301.reflectiondemo.Userme
public java.util.Map com.day301.reflectiondemo.TestFanxing.test02()

注解与反射映射成ORM

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {Class c1 = Class.forName("com.total.day301.Student");Annotation[] annotations = c1.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);}TableLipp tableLipp = (TableLipp) c1.getAnnotation(TableLipp.class);String value = tableLipp.value();System.out.println(value);Field f =c1.getDeclaredField("id");FieldLipp annotation  = f.getAnnotation(FieldLipp.class);System.out.println(annotation.columnName());System.out.println(annotation.type());System.out.println(annotation.length());}
}
package com.total.day301;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@TableLipp("db_student")
public class Student {@FieldLipp(columnName="db_id",type="int",length=10)private int id;@FieldLipp(columnName="db_age",type="int",length=10)private int age;@FieldLipp(columnName="db_name",type="varchar",length=10)private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [id=" + id + ", age=" + age + ", name=" + name + "]";}public Student(int id, int age, String name) {super();this.id = id;this.age = age;this.name = name;}public Student() {}}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface TableLipp{String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldLipp{String columnName();String type();int length();}

result:

@com.total.day301.TableLipp(value="db_student")
db_student
db_id
int
10

反射知识点总结《Lipp学习笔记》相关推荐

  1. SEO优化知识点以及思路学习笔记

    文章目录 前言 实用网站 工具网站 SEO知识博客 一.初步认识SEO 二.网页爬虫的管理规则 三.链接提交与页面收录 四.知识点学习 4.1.了解权重 4.2.点击率.访问量与停留时间 五.SEO优 ...

  2. CSS知识点之W3schools学习笔记

    近来把在w3schools上面把html.css.javascript的知识又从头到尾过了一遍,又发现了一些平时不了解的知识点,在此作下CSS的笔记,前端技术无穷尽,要时时学习时时总结! 1. tex ...

  3. Python 知识点超全学习笔记整理

    文章目录 入门必学基础 变量和数据类型 分支与循环 一.分支 **if...else** **if...elif...else** if语句的嵌套: 二.循环 1.while循环 2.for循环 三. ...

  4. java注解和反射——狂神说java学习笔记三

    原文链接:公众号狂神说 视频教程[狂神说B站]: https://www.bilibili.com/video/BV12J41137hu 如有侵权,联系立删 什么是注解 Annotation是从JDK ...

  5. 【超详细整理数组基础知识点】(学习笔记8--数组上)

    前言 新星计划第二篇博文,整理不易,点赞支持一下吧!!! 目录 一.一维数组 1.数组的定义 2.数组的大小 3.数组的初始化 4.数组的元素访问 二.数组与函数参数 1.数组元素作为函数参数 2.数 ...

  6. java架构知识点-中间件(学习笔记)

    一.缓存 为什么要使用缓存 (一)性能 我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入 缓存.这样,后面的请求就去缓存中读取,使得请求能够迅速响应. (二)并发 如下 ...

  7. JDBC,反射,Maven相关学习笔记

    JDBC 全称 java 数据库连接 JDBC的API 入门程序 1.在程序中加载数据库驱动 2.建立连接 3.创建用于向数据库发送 sql 的 statement 对象 4.从代表结果集的 resu ...

  8. Android开发六年收获阿里offer定级P7,多亏在阿里P8师兄给的攻略、面试技巧以及学习笔记!!!

    前言 又到了每年的毕业季,应届毕业生在找工作过程对于简历设计和面试技巧有一定的欠缺,这对于求职是比较重要的两个因素,因此掌握一定的面试技巧对于找互联网技术岗位的工作帮助非常大.本篇文章给大家分享一波职 ...

  9. Mybatis的学习笔记

    MyBatis Mybatis是一款非常优秀的持久层框架,学习的目的是要掌握精通. 那么今天我们就来学习一下这个优秀的框架知识! 此外,由于博主的水平的原因,文章的质量可能不会太高,请酌情观看.如果大 ...

最新文章

  1. mybatis02映射动态sql关联查询spring整合mybatis
  2. 四则运算c语言编程分支结构,C语言之分支结构(二)
  3. 因修改/etc/sudoers权限导致sudo和su不能使用的解决方法
  4. SpringMVC4集成ehcache
  5. UA MATH566 统计理论5 假设检验:p值
  6. 1006 换个格式输出整数 (15 分)(c语言)
  7. Android 系统(43)---HTTPS
  8. 2020-12-16子类对象指针强转成父类对象指针,父类对象指针调用子类函数问题(待整理)
  9. GraphQL 技术浅析
  10. 爬取QQ好友列表或定位QQ好友秘密
  11. 阿里云产品有哪些?各种产品都是干什么的?
  12. Ubuntu下全命令行部署Android模拟器
  13. linux的XDG(X Desktop Group)基本目录规范
  14. CMOS图像传感器基本原理
  15. Qt调节Win屏幕亮度和声音大小
  16. mysql中图书编号类型_练习1答案-数据库设计
  17. 玩家交互体验——梦幻飞仙
  18. 从小程序快速扫码进微信群聊
  19. 每日MySQL之024:FLUSH TABLES
  20. 2022年618投影仪保值品牌榜,当贝投影闲鱼保值率排行TOP1

热门文章

  1. (十二)office2016-excel快速识别身份证号是男是女
  2. linux文件如何通过vmtools共享到windows,使用vmtools来设置windows和linux的共享文件夹...
  3. python2.7 BeautifulSoup 爬QQ空间说说-含源码-第一天
  4. 用这个抢票神器,一抢一个准!
  5. 学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业
  6. 我们到底该转行Web全栈工程师吗?
  7. HTML中属性问题以及通信问题总结
  8. tf.nn.dropout() 警报信息处理
  9. 微软自带虚拟机Hyper—V启用
  10. LeetCode面试热题十二