java特性-----反射
一.反射
1.反射的三种获取Class类的方法
a.使用Class类的静态方法。
1 Class.forName("java.lang.String");
实例如下:(输出结果见下文)
1 try { 2 Class <?> clazz=Class.forName("com.pl.model.Area"); 3 Method methods[] = clazz.getDeclaredMethods(); 4 for(int i=0;i<methods.length;i++){ 5 System.out.println(methods[i]);//输入所有Area类中的方法 6 } 7 Field fields[] = clazz.getDeclaredFields(); 8 for(int i=0;i<fields.length;i++){ 9 System.out.println(fields[i]);//输出所有Area类中的属性 10 } 11 Constructor constructors[] =clazz.getDeclaredConstructors(); 12 for(int i=0;i<constructors.length;i++){ 13 System.out.println(constructors[i]);//输出所有Area类中的构造器 14 } 15 } catch (ClassNotFoundException e) { 16 e.printStackTrace(); 17 }
b.使用对象的getClass()方法。(一般放入方法中,传入一个对象)
1 Class<?> classType1 = str.getClass();
实例如下:
1 public static void test(Object obj){ 2 Class<?> clazz = obj.getClass(); 3 Method methods[] = clazz.getDeclaredMethods(); 4 for(int i=0;i<methods.length;i++){ 5 System.out.println(methods[i]); 6 } 7 Field fields[] = clazz.getDeclaredFields(); 8 for(int i=0;i<fields.length;i++){ 9 System.out.println(fields[i]); 10 } 11 Constructor constructors[] =clazz.getDeclaredConstructors(); 12 for(int i=0;i<constructors.length;i++){ 13 System.out.println(constructors[i]); 14 } 15 }
c.使用类的.class语法。
1 String.class;
实例如下:
public static void test(){ Class<?> clazz = Area.class; Method methods[] = clazz.getDeclaredMethods(); for(int i=0;i<methods.length;i++){ System.out.println(methods[i]); } Field fields[] = clazz.getDeclaredFields(); for(int i=0;i<fields.length;i++){ System.out.println(fields[i]); } Constructor constructors[] =clazz.getDeclaredConstructors(); for(int i=0;i<constructors.length;i++){ System.out.println(constructors[i]); } }
测试类Area代码如下:
1 package com.pl.model; 2 3 /** 4 * @AutLhor: Mr.P 5 * @Date: 2019/10/17 6 * @Time: 22:51 7 */ 8 public class Area { 9 private Integer areaId; 10 private String areaName; 11 private Integer pId; 12 private Integer level; 13 14 public Integer getAreaId() { 15 return areaId; 16 } 17 18 public void setAreaId(Integer areaId) { 19 this.areaId = areaId; 20 } 21 22 public String getAreaName() { 23 return areaName; 24 } 25 26 public void setAreaName(String areaName) { 27 this.areaName = areaName; 28 } 29 30 public Integer getPId() { 31 return pId; 32 } 33 34 public void setPId(Integer pId) { 35 this.pId = pId; 36 } 37 38 public Integer getLevel() { 39 return level; 40 } 41 42 public void setLevel(Integer level) { 43 this.level = level; 44 } 45 46 public Area() { 47 super(); 48 } 49 50 public Area(Integer areaId, String areaName, Integer pId, Integer level) { 51 this.areaId = areaId; 52 this.areaName = areaName; 53 this.pId = pId; 54 this.level = level; 55 } 56 57 @Override 58 public String toString() { 59 return "Area{" + 60 "areaId=" + areaId + 61 ", areaName='" + areaName + '\'' + 62 ", pId=" + pId + 63 ", level=" + level + 64 '}'; 65 } 66 } 67
log输出如下:
1 com.pl.model.Area 2 public java.lang.String com.pl.model.Area.toString() 3 public java.lang.Integer com.pl.model.Area.getAreaId() 4 public void com.pl.model.Area.setLevel(java.lang.Integer) 5 public void com.pl.model.Area.setAreaId(java.lang.Integer) 6 public void com.pl.model.Area.setPId(java.lang.Integer) 7 public java.lang.Integer com.pl.model.Area.getPId() 8 public java.lang.Integer com.pl.model.Area.getLevel() 9 public java.lang.String com.pl.model.Area.getAreaName() 10 public void com.pl.model.Area.setAreaName(java.lang.String) 11 private java.lang.Integer com.pl.model.Area.areaId 12 private java.lang.String com.pl.model.Area.areaName 13 private java.lang.Integer com.pl.model.Area.pId 14 private java.lang.Integer com.pl.model.Area.level 15 public com.pl.model.Area() 16 public com.pl.model.Area(java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Integer)
2.生成对象的两种方法
a.先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:
1 Class<?> clazz = Radute.class; 2 Object demo =clazz.newInstance();
b.先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成
1 Class clazz =Class.forName("com.pl.model.Area"); 2 Constructor constructor = clazz.getDeclaredConstructor(new Class[]{});//如果new class[]{}是空的,可以使用null或者不写 3 Object instance =constructor.newInstance(new Object[]{});//反向创建了一个对象
3.关于new Object[]{}与new Class[]{}的区别
a.含义上的区别
new Object[]{}表示的是创建一个对象数组,即里面存放的是Object对象组.
new Class[]{}表示的是创建一个类对象数据,即里面存放的都是类对象.
b.使用的地方
什么时候为使用到Object类数组呢呢?很大可能就是会出现数组类的类型不同,所以这时候要用Object这个祖先数组类去包容,自当我们调用方法传参的时候,参数的类型很可能会出现不一致,所以就需要它了
当我们利用有参构造器创建实体类时
1 Object instance =constructor.newInstance(new Object[]{1001,'北京',1234,12});
当我们调用set等方法给实体类反向复制的时候
1 m.invoke(instance,new Object[]{1002});
如果方法不需要传参数的话可以new Object[]{}或者null
对于new Class[]{}来说,它表示的是类数组,意思就是类的种类,我们调用某个类的时候一般使用的是
1 Method method = clazz.getDeclaredMethod(methodName,new Class[]{});
但是由于java重写这一特性,如果简单的通过方法名势必无法确定两个同名方法,这时候具需要具体的把参数也表示出来,也就是new Class[][}
1 Method method = clazz.getDeclaredMethod(methodName,new Class[]{int.class,int.class});
说到这里,其实有关new Object[]{}和new Class[]{}的区别已经呼之欲出了,就是我们方法里的一个形参,一个实参而已,
new Class[]{}就是形参类型,new Object[]{}就是实参,只不过是形参的类型都是class而已,而实参的类型却不同,所以一个用
class,一个用object而已.
原文地址:https://www.cnblogs.com/pl12138/p/11744112.html
- HDUOJ----A Computer Graphics Problem
- HDUOJ---(4708)Herding
- HDUOJ---(4708)Rotation Lock Puzzle
- HDUOJ---Hamming Distance(4712)
- HDUOJ-----Difference Between Primes
- HDUOJ----(4706)Children's Day
- poj-------Common Subsequence(poj 1458)
- poj----Maximum sum(poj 2479)
- HDUOJ---hello Kiki
- HDUOJ-----X问题
- POJ-----C Looooops
- POJ--Strange Way to Express Integers
- HDUOJ----More is better(并查集)
- HDUOJ 1099——Lottery
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释