java反射机制(java中的反射机制是什么,有什么作用啊)
各位老铁们好,相信很多人对java反射机制都不是特别的了解,因此呢,今天就来为大家分享下关于java反射机制以及java中的反射机制是什么,有什么作用啊的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
java中反射的三种方法是
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。
反射的好处:大大的增强了程序的扩展性。
反射的基本步骤:
1、获得Class对象,就是获取到指定的名称的字节码文件对象。
2、实例化对象,获得类的属性、方法或构造函数。
3、访问属性、调用方法、调用构造函数创建对象。
获取这个Class对象,有三种方式:
1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。
2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。
前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。
3:使用的Class类中的方法,静态的forName方法。
指定什么类名,就获取什么类字节码文件对象,这种方式的扩展性最强,只要将类名的字符串传入即可。
// 1.根据给定的类名来获得用于类加载
String classname="cn.itcast.reflect.Person";//来自配置文件
Class clazz= Class.forName(classname);//此对象代表Person.class
// 2.如果拿到了对象,不知道是什么类型用于获得对象的类型
Object obj= new Person();
Class clazz1= obj.getClass();//获得对象具体的类型
// 3.如果是明确地获得某个类的Class对象主要用于传参
Class clazz2= Person.class;
反射的用法:
1)、需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:
Class.forName(classname)用于做类加载
obj.getClass()用于获得对象的类型
类名.class用于获得指定的类型,传参用
2)、反射类的成员方法:
Class clazz= Person.class;
Method method= clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
3)、反射类的构造函数:
Constructor con= clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
con.newInstance(params...)
4)、反射类的属性:
Field field= clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);
获取了字节码文件对象后,最终都需要创建指定类的对象:
创建对象的两种方式(其实就是对象在进行实例化时的初始化方式):
1,调用空参数的构造函数:使用了Class类中的newInstance()方法。
2,调用带参数的构造函数:先要获取指定参数列表的构造函数对象,然后通过该构造函数的对象的newInstance(实际参数)进行对象的初始化。
综上所述,第二种方式,必须要先明确具体的构造函数的参数类型,不便于扩展。所以一般情况下,被反射的类,内部通常都会提供一个公有的空参数的构造函数。
------------------------------------------------------
//如何生成获取到字节码文件对象的实例对象。
Class clazz= Class.forName("cn.itcast.bean.Person");//类加载
//直接获得指定的类型
clazz= Person.class;
//根据对象获得类型
Object obj= new Person("zhangsan", 19);
clazz= obj.getClass();
Object obj= clazz.newInstance();//该实例化对象的方法调用就是指定类中的空参数构造函数,给创建对象进行初始化。当指定类中没有空参数构造函数时,该如何创建该类对象呢?请看method_2();
public static void method_2() throws Exception{
Class clazz= Class.forName("cn.itcast.bean.Person");
//既然类中没有空参数的构造函数,那么只有获取指定参数的构造函数,用该函数来进行实例化。
//获取一个带参数的构造器。
Constructor constructor= clazz.getConstructor(String.class,int.class);
//想要对对象进行初始化,使用构造器的方法newInstance();
Object obj= constructor.newInstance("zhagnsan",30);
//获取所有构造器。
Constructor[] constructors= clazz.getConstructors();//只包含公共的
constructors= clazz.getDeclaredConstructors();//包含私有的
for(Constructor con: constructors){
System.out.println(con);
}
}
------------------------------------------------------
反射指定类中的方法:
//获取类中所有的方法。
public static void method_1() throws Exception{
Class clazz= Class.forName("cn.itcast.bean.Person");
Method[] methods= clazz.getMethods();//获取的是该类中的公有方法和父类中的公有方法。
methods= clazz.getDeclaredMethods();//获取本类中的方法,包含私有方法。
for(Method method: methods){
System.out.println(method);
}
}
//获取指定方法;
public static void method_2() throws Exception{
Class clazz= Class.forName("cn.itcast.bean.Person");
//获取指定名称的方法。
Method method= clazz.getMethod("show", int.class,String.class);
//想要运行指定方法,当然是方法对象最清楚,为了让方法运行,调用方法对象的invoke方法即可,但是方法运行必须要明确所属的对象和具体的实际参数。
Object obj= clazz.newInstance();
method.invoke(obj, 39,"hehehe");//执行一个方法
}
//想要运行私有方法。
public static void method_3() throws Exception{
Class clazz= Class.forName("cn.itcast.bean.Person");
//想要获取私有方法。必须用getDeclearMethod();
Method method= clazz.getDeclaredMethod("method", null);
//私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。
method.setAccessible(true);//一般很少用,因为私有就是隐藏起来,所以尽量不要访问。
}
//反射静态方法。
public static void method_4() throws Exception{
Class clazz= Class.forName("cn.itcast.bean.Person");
Method method= clazz.getMethod("function",null);
method.invoke(null,null);
}
java的反射机制是什么
Java的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean中广泛应用的一种特性。
运用JavaBean的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的一个例子演示了这一实现。
-|Base.java//抽象基类
|Son1.java//基类扩展1
|Son2.java//基类扩展2
|Util.java
/**
*@author metaphy
* create 2005-4-14 9:06:56
*说明:
*/
(1)Base.java抽象基类只是一个定义
public abstract class Base{
}
(2)Son1.java/Son2.java是已经实现的JavaBean
public class Son1 extends Base{
private int id;
private String name;
public int getId(){
return id;
}
public void setId(int id){
this.id= id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name= name;
}
public void son1Method(String s){
System.out.println(s);
}
}
(3)
public class Son2 extends Base{
private int id;
private double salary;
public int getId(){
return id;
}
public void setId(int id){
this.id= id;
}
public double getSalary(){
return salary;
}
public void setSalary(double salary){
this.salary= salary;
}
}
(4)Util.java演示了如何根据指定的类名,类字段名和所对应的数据,得到一个类的实例
import java.lang.reflect.Method;
public class Util{
//此方法的最大好处是没有类名Son1,Son2可以通过参数来指定,程序里面根本不用出现
public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){
Base base= null;
try{
Class cls= Class.forName(beanName);
base=(Base)cls.newInstance();
Class[] paraTypes= new Class[]{String.class};
Method method= cls.getMethod(fieldSetter, paraTypes);
String[] paraValues= new String[]{paraValue};
method.invoke(base, paraValues);
} catch(Throwable e){
System.err.println(e);
}
return base;
}
public static void main(String[] args){
Son1 son1=(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha");
System.out.println("son1.getName():"+son1.getName());
}
}
//调用结果:
//son1.getName():wang da sha
谢谢!希望能给大家一点启发!
--------------------
附:
//下面这篇文档来源于Internet,作者不详
Reflection是 Java程序开发语言的特征之一,它允许运行中的 Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java类中各成员的名称并显示出来。
Java的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C或者 C++中就没有办法在程序中获得函数定义相关的信息。
JavaBean是 reflection的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection动态的载入并取得 Java组件(类)的属性。
1.一个简单的例子
考虑下面这个简单的例子,让我们看看 reflection是如何工作的。
import java.lang.reflect.*;
public class DumpMethods{
public static void main(String args[]){
try{
Class c= Class.forName(args[0]);
Method m[]= c.getDeclaredMethods();
for(int i= 0; i< m.length; i++)
System.out.println(m[i].toString());
} catch(Throwable e){
System.err.println(e);
}
}
}
按如下语句执行:
java DumpMethods java.util.Stack
它的结果输出为:
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)
这样就列出了java.util.Stack类的各方法名以及它们的限制符和返回类型。
这个程序使用 Class.forName载入指定的类,然后调用 getDeclaredMethods来获取这个类中定义了的方法列表。java.lang.reflect.Methods是用来描述某个类中单个方法的一个类。
2.开始使用 Reflection
用于 reflection的类,如 Method,可以在 java.lang.relfect包中找到。使用这些类的时候必须要遵循三个步骤:第一步是获得你想操作的类的 java.lang.Class对象。在运行中的 Java程序中,用 java.lang.Class类来描述类和接口等。
下面就是获得一个 Class对象的方法之一:
Class c= Class.forName("java.lang.String");
这条语句得到一个 String类的类对象。还有另一种方法,如下面的语句:
Class c= int.class;
或者
Class c= Integer.TYPE;
它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类(如 Integer)中预先定义好的 TYPE字段。
第二步是调用诸如 getDeclaredMethods的方法,以取得该类中定义的所有方法的列表。
一旦取得这个信息,就可以进行第三步了——使用 reflection API来操作这些信息,如下面这段代码:
Class c= Class.forName("java.lang.String");
Method m[]= c.getDeclaredMethods();
System.out.println(m[0].toString());
它将以文本方式打印出 String中定义的第一个方法的原型。
在下面的例子中,这三个步骤将为使用 reflection处理特殊应用程序提供例证。
模拟 instanceof操作符
得到类信息之后,通常下一个步骤就是解决关于 Class对象的一些基本的问题。例如,Class.isInstance方法可以用于模拟 instanceof操作符:
class A{
}
public class instance1{
public static void main(String args[]){
try{
Class cls= Class.forName("A");
boolean b1= cls.isInstance(new Integer(37));
System.out.println(b1);
boolean b2= cls.isInstance(new A());
System.out.println(b2);
} catch(Throwable e){
System.err.println(e);
}
}
}
在这个例子中创建了一个 A类的 Class对象,然后检查一些对象是否是 A的实例。Integer(37)不是,但 new A()是。
3.找出类的方法
找出一个类中定义了些什么方法,这是一个非常有价值也非常基础的 reflection用法。下面的代码就实现了这一用法:
import java.lang.reflect.*;
public class method1{
private int f1(Object p, int x) throws NullPointerException{
if(p== null)
throw new NullPointerException();
return x;
}
public static void main(String args[]){
try{
Class cls= Class.forName("method1");
Method methlist[]= cls.getDeclaredMethods();
for(int i= 0; i< methlist.length; i++){
Method m= methlist[i];
System.out.println("name="+ m.getName());
System.out.println("decl class="+ m.getDeclaringClass());
Class pvec[]= m.getParameterTypes();
for(int j= 0; j< pvec.length; j++)
System.out.println("param#"+ j+""+ pvec[j]);
Class evec[]= m.getExceptionTypes();
for(int j= 0; j< evec.length; j++)
System.out.println("exc#"+ j+""+ evec[j]);
System.out.println("return type="+ m.getReturnType());
System.out.println("-----");
}
} catch(Throwable e){
System.err.println(e);
}
}
}
这个程序首先取得 method1类的描述,然后调用 getDeclaredMethods来获取一系列的 Method对象,它们分别描述了定义在类中的每一个方法,包括 public方法、protected方法、package方法和 private方法等。如果你在程序中使用 getMethods来代替 getDeclaredMethods,你还能获得继承来的各个方法的信息。
取得了 Method对象列表之后,要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型,都可以由描述类的对象按顺序给出。
输出的结果如下:
name= f1
decl class= class method1
param#0 class java.lang.Object
param#1 int
exc#0 class java.lang.NullPointerException
return type= int
-----
name= main
decl class= class method1
param#0 class [Ljava.lang.String;
return type= void
-----
4.获取构造器信息
获取类构造器的用法与上述获取方法的用法类似,如:
import java.lang.reflect.*;
public class constructor1{
public constructor1(){
}
protected constructor1(int i, double d){
}
public static void main(String args[]){
try{
Class cls= Class.forName("constructor1");
Constructor ctorlist[]= cls.getDeclaredConstructors();
for(int i= 0; i< ctorlist.length; i++){
Constructor ct= ctorlist[i];
System.out.println("name="+ ct.getName());
System.out.println("decl class="+ ct.getDeclaringClass());
Class pvec[]= ct.getParameterTypes();
for(int j= 0; j< pvec.length; j++)
System.out.println("param#"+ j+""+ pvec[j]);
Class evec[]= ct.getExceptionTypes();
for(int j= 0; j< evec.length; j++)
System.out.println("exc#"+ j+""+ evec[j]);
System.out.println("-----");
}
} catch(Throwable e){
System.err.println(e);
}
}
}
这个例子中没能获得返回类型的相关信息,那是因为构造器没有返回类型。
这个程序运行的结果是:
name= constructor1
decl class= class constructor1
-----
name= constructor1
decl class= class constructor1
param#0 int
param#1 double
-----
5.获取类的字段(域)
找出一个类中定义了哪些数据字段也是可能的,下面的代码就在干这个事情:
import java.lang.reflect.*;
public class field1{
private double d;
public static final int i= 37;
String s="testing";
public static void main(String args[]){
try{
Class cls= Class.forName("field1");
Field fieldlist[]= cls.getDeclaredFields();
for(int i= 0; i< fieldlist.length; i++){
Field fld= fieldlist[i];
System.out.println("name="+ fld.getName());
System.out.println("decl class="+ fld.getDeclaringClass());
System.out.println("type="+ fld.getType());
int mod= fld.getModifiers();
System.out.println("modifiers="+ Modifier.toString(mod));
System.out.println("-----");
}
} catch(Throwable e){
System.err.println(e);
}
}
}
这个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier,它也是一个 reflection类,用来描述字段成员的修饰语,如“private int”。这些修饰语自身由整数描述,而且使用 Modifier.toString来返回以“官方”顺序排列的字符串描述(如“static”在“final”之前)。这个程序的输出是:
name= d
decl class= class field1
type= double
modifiers= private
-----
name= i
decl class= class field1
type= int
modifiers= public static final
-----
name= s
decl class= class field1
type= class java.lang.String
modifiers=
-----
和获取方法的情况一下,获取字段的时候也可以只取得在当前类中申明了的字段信息(getDeclaredFields),或者也可以取得父类中定义的字段(getFields)。
6.根据方法的名称来执行方法
文本到这里,所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection来做一些其它的事情,比如执行一个指定了名称的方法。下面的示例演示了这一操作:
import java.lang.reflect.*;
public class method2{
public int add(int a, int b){
return a+ b;
}
public static void main(String args[]){
try{
Class cls= Class.forName("method2");
Class partypes[]= new Class[2];
partypes[0]= Integer.TYPE;
partypes[1]= Integer.TYPE;
Method meth= cls.getMethod("add", partypes);
method2 methobj= new method2();
Object arglist[]= new Object[2];
arglist[0]= new Integer(37);
arglist[1]= new Integer(47);
Object retobj= meth.invoke(methobj, arglist);
Integer retval=(Integer) retobj;
System.out.println(retval.intvalue());
} catch(Throwable e){
System.err.println(e);
}
}
}
假如一个程序在执行的某处的时候才知道需要执行某个方法,这个方法的名称是在程序的运行过程中指定的(例如,JavaBean开发环境中就会做这样的事),那么上面的程序演示了如何做到。
上例中,getMethod用于查找一个具有两个整型参数且名为 add的方法。找到该方法并创建了相应的 Method对象之后,在正确的对象实例中执行它。执行该方法的时候,需要提供一个参数列表,这在上例中是分别包装了整数 37和 47的两个 Integer对象。执行方法的返回的同样是一个 Integer对象,它封装了返回值 84。
7.创建新的对象
对于构造器,则不能像执行方法那样进行,因为执行一个构造器就意味着创建了一个新的对象(准确的说,创建一个对象的过程包括分配内存和构造对象)。所以,与上例最相似的例子如下:
import java.lang.reflect.*;
public class constructor2{
public constructor2(){
}
public constructor2(int a, int b){
System.out.println("a="+ a+" b="+ b);
}
public static void main(String args[]){
try{
Class cls= Class.forName("constructor2");
Class partypes[]= new Class[2];
partypes[0]= Integer.TYPE;
partypes[1]= Integer.TYPE;
Constructor ct= cls.getConstructor(partypes);
Object arglist[]= new Object[2];
arglist[0]= new Integer(37);
arglist[1]= new Integer(47);
Object retobj= ct.newInstance(arglist);
} catch(Throwable e){
System.err.println(e);
}
}
}
根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
8.改变字段(域)的值
reflection的还有一个用处就是改变对象数据字段的值。reflection可以从正在运行的程序中根据名称找到对象的字段并改变它,下面的例子可以说明这一点:
import java.lang.reflect.*;
public class field2{
public double d;
public static void main(String args[]){
try{
Class cls= Class.forName("field2");
Field fld= cls.getField("d");
field2 f2obj= new field2();
System.out.println("d="+ f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d="+ f2obj.d);
} catch(Throwable e){
System.err.println(e);
}
}
}
这个例子中,字段 d的值被变为了 12.34。
9.使用数组
本文介绍的 reflection的最后一种用法是创建的操作数组。数组在 Java语言中是一种特殊的类类型,一个数组的引用可以赋给 Object引用。观察下面的例子看看数组是怎么工作的:
import java.lang.reflect.*;
public class array1{
public static void main(String args[]){
try{
Class cls= Class.forName("java.lang.String");
Object arr= Array.newInstance(cls, 10);
Array.set(arr, 5,"this is a test");
String s=(String) Array.get(arr, 5);
System.out.println(s);
} catch(Throwable e){
System.err.println(e);
}
}
}
例中创建了 10个单位长度的 String数组,为第 5个位置的字符串赋了值,最后将这个字符串从数组中取得并打印了出来。
下面这段代码提供了一个更复杂的例子:
import java.lang.reflect.*;
public class array2{
public static void main(String args[]){
int dims[]= new int[]{5, 10, 15};
Object arr= Array.newInstance(Integer.TYPE, dims);
Object arrobj= Array.get(arr, 3);
Class cls= arrobj.getClass().getComponentType();
System.out.println(cls);
arrobj= Array.get(arrobj, 5);
Array.setInt(arrobj, 10, 37);
int arrcast[][][]=(int[][][]) arr;
System.out.println(arrcast[3][5][10]);
}
}
例中创建了一个 5 x 10 x 15的整型数组,并为处于 [3][5][10]的元素赋了值为 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get之后,arrobj是一个 10 x 15的数组。进而取得其中的一个元素,即长度为 15的数组,并使用 Array.setInt为它的第 10个元素赋值。
注意创建数组时的类型是动态的,在编译时并不知道其类型。
java中的反射机制是什么,有什么作用啊
Method类中的方法的使用(含代码和注释):
getMethods()获得本类及父类中的public权限修饰**符方法
getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法
getDeclaredMethod(Stringname,class<?>...parameterTypes)
第一个参数:方法的名称
第二个参数:可变长度,写你要查找的那个方法的参数类型列表.class
getParameterCount()得到方法的参数个数123456
packageLessonForReflection03;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;abstractclassCard{
privatevoidcreatRandomNumbers(intcount)//private关键字
{
}
publicvoidgetFullCardsNumbers(String[]random,Stringpre_numbers)
{
}
publicstaticvoidgetUserInfor()
{
}
publicabstractvoidgetUserInfor(Stringtel);
publicabstractvoidgetUserInfor(intsal1,intsal2)throwsArrayIndexOutOfBoundsException,ArithmeticException;}publicclassMethodInforGetter{
publicstaticvoidmain(String[]args)
{
Class<?>c1=Card.class;
System.out.println("-------------------------");
Method[]m1=c1.getMethods();//getMethods()获得本类及父类中的public方法!
for(Methodm:m1)
{
System.out.println(m);
}
System.out.println("-------------------------");
Method[]m2=c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!
for(Methodm:m2)
{
System.out.println(m);
}
System.out.println("-------------------------");
/*
*getDeclaredMethod(Stringname,class<?>...parameterTypes)
*第一个参数:方法的名称
*第二个参数:可变长度,写你要查找的那个方法的参数类型列表
*
*getParameterCount()得到方法的参数个数
*/
try
{
Methodm3=c1.getDeclaredMethod("getUserInfor");
System.out.println(m3);
//getParameterCount()方法,获得方法参数个数
System.out.println(m3.getParameterCount());
System.out.println(Modifier.toString(m3.getModifiers()));//获得方法修饰符
System.out.println(m3.getReturnType());
System.out.println("-------------------------");
Methodm4=c1.getDeclaredMethod("getUserInfor",int.class,int.class);
//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型
Class<?>[]exception=m4.getExceptionTypes();
for(Class<?>e:exception)
{
System.out.println(e);
}
}catch(NoSuchMethodException|SecurityExceptione)
{
e.printStackTrace();
}
}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
Constructor类中的方法的使用www.xiaoyuani.com(含代码和注释):
java.lang.reflect.Constructor:
Constructor[]getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!
Constructor[]getDeclaredConstructor()获得本类中的所以构造函数!
Constructor<T>getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的
Constructor<T>getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法
附:
JDK8.0之后新增的类:
Executable:
它是Method和Constructor的父类
常用方法:
getParameter()获得类中方法参数
getExceptionTypes()获得类中某个方法抛出异常类型
getMoidfiers()获得方法权限修饰符
Parameter:
封装并代表了参数实例123456789101112131415
packageLessonForReflection03;importjava.lang.reflect.Constructor;importjava.lang.reflect.Modifier;importjava.lang.reflect.Parameter;/*
*java.lang.reflect.Constructor
*
*Constructor[]getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的
*Constructor[]getDeclaredConstructor();得本类里的全部构造
*
*Constructor<T>getConstructor(Class...parameterType);用参数决定获得哪个构造方法
*Constructor<T>getDeclaredConstructor(Class...parameterType);
*
*/publicclassConstructorInforGetter{
publicstaticvoidmain(String[]args)
{
System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[]getConstructor()");
System.out.println("子类继承不了父类中的构造方法和private");
//Constructor[]getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的
//子类继承不了父类中的构造方法和private
Class<Circle>c1=Circle.class;
Constructor<?>[]cons1=c1.getConstructors();
for(Constructor<?>cons:cons1)
{
System.out.println(cons);
//System.out.println(cons.getName());
}
System.out.println("-----------------------");
System.out.println("方法获得本类中的所有构造函数getDeclaredConstructor()");
Constructor<?>[]cons2=c1.getDeclaredConstructors();
for(Constructor<?>cons:cons2)
{
System.out.println(cons);
}
System.out.println("-----------------------");
try
{
System.out.println("方法用参数指定获得本类!构造方法,只能获取public的Constructor<T>getConstructor(Class...parameterType)");
Constructor<?>cons3=c1.getConstructor(int.class);
System.out.println(Modifier.toString(cons3.getModifiers()));
System.out.println(cons3);
System.out.println("-----------------------");
System.out.println("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得Constructor<T>getDeclaredConstructor(Class...parameterType)");
Constructor<?>cons4=c1.getDeclaredConstructor(String.class);
System.out.println(cons4);
System.out.println("-----------------------");
/*
*JDK8.0之后新增的类
*Executable:
*是Method和Constructor的父类
*方法:
*getParameter();
*getExceptionTypes();
*getModifiers();
*getTypeParameters();
*
*Parameter:
*封装并代表了参数实例
*/
System.out.println("获取类中方法的参数getParameters()");
Constructor<?>cons5=c1.getDeclaredConstructor(int.class,String.class);
Parameter[]p1=cons5.getParameters();
for(Parameterp:p1)
{
System.out.println(p);
}
}catch(NoSuchMethodException|SecurityExceptione)
{
e.printStackTrace();
}
}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
代码中提到的Circle类和Shape类二者为继承关系:
packageLessonForReflection03;publicclassCircleextendsShape{
privateintr;
privateStringcolor;
publicCircle(intr,Stringcolor)
{
super();
this.r=r;
this.color=color;
}
publicCircle(intr)
{
super();
this.r=r;
}
protectedCircle(Stringcolor)
{
super();
this.color=color;
}
Circle()
{
super();
}}12345678910111213141516171819202122232425262728293031
packageLessonForReflection03;publicclassShape{
privateintper;
publicShape(intper)
{
super();
this.per=per;
}
publicShape()
{
super();
}}1234567891011121314151617
部分文字来源于:
咕嘟咖啡杨海滨老师—《java编程语言高级特性》
轻量化研习Java相关技术倡导者
“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富
文章到此结束,希望我们对于java反射机制的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。