【java学习

您所在的位置:网站首页 接口构造方法 【java学习

【java学习

2024-01-21 01:32| 来源: 网络整理| 查看: 265

文章目录 1. 通过反射获取一个类的父类和接口2. 反射获取一个类的构造方法3. 反射获取全部构造器4. 通过反射创建一个对象5. 反射机制获取类的方法

1. 通过反射获取一个类的父类和接口

使用反射可以取得:

实现的全部接口 public Class[] getInterfaces():确定此对象所表示的类或接口实现的接口。所继承的父类 public Class[] getParameterTypes();

举例:

Test.java:

package day14; import java.lang.reflect.Constructor; public class Test1 { public static void main(String[] args) { try { Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例 Constructor[] cons = clazz.getConstructors();//获取类的公有构造方法 for(Constructor c : cons) { System.out.println("-----------------------0------------------------------"); System.out.println("构造方法名称:" + c.getName());//获取方法名称 //getModifiers取得方法的修饰符,返回数组1代表public System.out.println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());//获取方法的修饰符 Class[] paramClazz = c.getParameterTypes(); for(Class pc : paramClazz) { System.out.println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName()); } System.out.println("-----------------------1------------------------------"); } Constructor[] cons1 = clazz.getDeclaredConstructors();//获取类的所有构造方法,包括公有和私有的 for(Constructor c : cons1) { System.out.println("----------------------000-----------------------------"); System.out.println("构造方法名称:" + c.getName());//获取方法名称 //getModifiers取得方法的修饰符,返回数组1代表public;返回数字2代表是private System.out.println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());//获取方法的修饰符 Class[] paramClazz = c.getParameterTypes(); for(Class pc : paramClazz) { System.out.println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName()); } System.out.println("----------------------111-----------------------------"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }

运行结果:

在这里插入图片描述

4. 通过反射创建一个对象

举例: Student类:

package day14; public class Student extends Person implements Move,Study{ public Student() { System.out.println("调用的是public Student()"); } public Student(String school) { this.school = school; System.out.println("调用的是public Student(String school)"); } private Student(String school, int age) { this.school = school; this.age = age; System.out.println("调用的是private Student(String school, int age)"); } String school; public void showInfo() { System.out.println("学校是:" + this.school); } @Override public void studyInfo() { System.out.println("学习的是中学知识"); } @Override public void moveType() { System.out.println("骑自行车去上学"); } }

Test.java:

package day14; import java.lang.reflect.Constructor; public class Test1 { public static void main(String[] args) { try { Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例 //如何用反射的构造方法来创建对象 try { Object obj = clazz.getDeclaredConstructor().newInstance();//相当于调用Student类的无参公有的构造方法 Student stu = (Student) obj; // System.out.println(stu.school); Constructor c = clazz.getConstructor(String.class);//指定获取有一个参数并且为String类型的共有的构造方法 Student stu1 = (Student)c.newInstance("第一中学");//newInstance实例化对象,相当于调用public Student(String school) //通过反射机制可以强制地调用私有的构造方法 Constructor c1 = clazz.getDeclaredConstructor(String.class, int.class);//指定获取有两个参数(String, int)的构造方法 c1.setAccessible(true);//解除私有的封装,下面就可以对这个私有方法强制调用 Student stu2 = (Student)c1.newInstance("zhangsan",12); } catch (Exception e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }

运行结果: 在这里插入图片描述

5. 反射机制获取类的方法

public Method[] getDeclaredMethods():返回此 Class 对象所表示的类或接口的全部方法 public Method[] getMethods():返回此 Class 对象所表示的类或接口的 public 的方法

Method 类中:

public Class getReturnType():取得全部的返回值public Class[] getParameterTypes(): 取得全部的参数public int getModifiers(): 取得修饰符

举例:

Student类

package day14; public class Student extends Person implements Move,Study{ public Student() { System.out.println("调用的是public Student()"); } public Student(String school) { this.school = school; System.out.println("调用的是public Student(String school)"); } private Student(String school, int age) { this.school = school; this.age = age; System.out.println("调用的是private Student(String school, int age)"); } String school; public void showInfo() { System.out.println("学校是:" + this.school); } @Override public void studyInfo() { System.out.println("学习的是中学知识"); } @Override public void moveType() { System.out.println("骑自行车去上学"); } private void test(String name) { } public String getSchool() { return this.school; } }

Test.java:

package day14; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Test1 { public static void main(String[] args) { try { Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例 // Method[] ms = clazz.getMethods();//获取到类的所有公有的方法 Method[] ms = clazz.getDeclaredMethods();//获取到类的所有方法,包括私有的 for(Method m : ms) { System.out.println("方法名:" + m.getName()); System.out.println("方法名:" + m.getReturnType()); System.out.println("方法名:" + m.getModifiers()); Class[] pcs= m.getParameterTypes();//获取方法的参数类型,是一个数组,方法有几个参数,数据就有几个元素 if(pcs != null && pcs.length > 0) { for(Class pc : pcs) { System.out.println("参数类型:" + pc.getName()); } } System.out.println("======================================="); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }

运行结果: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3