标签:方法调用 -- 无法 种类型 except str string 参数 src
1、概述
1.1 Java程序中许多对象在运行时会出现2种类型:编译时类型、运行时类型;
eg:Person person=new Student(); 这行代码在编译时为Person类型,运行时为Student类型;
eg:程序在运行时接受到外部传来的一个参数,编译时为Object类型,运行时又需要调用具体的运行时类型;
【解决以上问题】:
1.1.1 假设编译时类型、运行时类型都已知,可以用instanceof运算符进行判断,再利用强制类型转换为运行时类型;
1.1.2 若编译时无法 得知该对象的类型,程序只能靠 反射 来 获取运行时的具体类型信息;
1.2 【>>>获得Class对象<<<】
====每个类被加载后,在内存中都会创建一个该类的Class对象,通过Class对象就可以获得该类;
1.1.1 调用Class对象的forName(),返回该类的Class对象 public static Class<?> forName(String className)
className:类的全限定名
1.1.2 调用某个类的class属性,将返回该类的Class对象;
1.1.3 调用某个类的getClass(),将返回该类的Class对象;
1.3 【>>>从Class对象中获取信息<<<】
1.1.1 访问Class对应类包含的构造器
1.1.2 访问Class对应类包含的方法
1.1.3 访问Class对应类包含的属性
1.1.4 访问Class对应类上的注解
1.1.5 访问Class对应类包含的内部类
1.1.6 访问Class对应类包含的外部类
1.1.7 访问Class对应类所继承的父类、实现的接口
1.1.8 判断Class对应类是接口、注解、枚举等
1.4 【使用反射生成并操作对象】
1.1.1 创建对象
调用Class对象的newInstance() public T newInstance()
此方法要求该Class对象对应的类有默认构造器,newInstance()实际上就是调用默认构造器创建实例;
package com.exiuge.mytest.reflect; import java.lang.reflect.Constructor; public class Test { public static void main(String[] args)throws Exception{ Class clazz=Class.forName("com.exiuge.mytest.reflect.User"); User user=(User) clazz.newInstance(); } }
先获取Class对象的指定构造器Constructor对象,再调用Constructor对象的newInstance()来获得实例
package com.exiuge.mytest.reflect; import java.lang.reflect.Constructor; public class Test { public static void main(String[] args)throws Exception{ Class clazz=Class.forName("com.exiuge.mytest.reflect.User"); Constructor constructor =clazz.getConstructor(); User user=(User) constructor.newInstance(); } }
1.1.2 调用方法
获取Class对象后,可获取Method对象来进行方法调用,Method对象有一个方法
public Object invoke(Object obj, Object... args)
1.1.3 访问属性值
1.1.4 操作数组
标签:方法调用 -- 无法 种类型 except str string 参数 src
原文地址:https://www.cnblogs.com/anpeiyong/p/10428556.html