Java Class
类
在前一个主题中,我们讨论了如何在运行时使用各种方法加载类。在这里,我们将看到如何获取该类的元数据、方法和字段。
Class
是 java.lang 包中的最后一个类,它扩展了 Object 类。此类的实例表示运行的 Java 应用中的类和接口。它用于在运行时分析和更改类的动态行为。
Java.lang.Class 方法
这个类定义了几个方法,使用这些方法我们可以在运行时获得类的方法、构造器、修饰符和成员的信息。
续见()
此方法以类或接口的完全限定名作为参数,并返回与之关联的类的实例。
语法
static **Class**< ?> forName(String *className*)
示例:获取类元数据
要获取类的元数据,首先需要使用class.forName()
方法加载类,然后使用 class 方法。在这个例子中,我们使用getName()
方法获取类名,getDeclaredFields()
获取该类的所有字段。见下面的例子。
package myjavaproject;
import java.util.Arrays;
// Employee Class
class Employee{
// Fields
int empId;
String name;
// Constructor
Employee(int empId, String name){
this.empId = empId;
this.name = name;
}
// Method
void showInfo() {
System.out.println("Employee Id: "+empId);
System.out.println("Employee Name: "+name);
}
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException {
// Employee class
Class name = Class.forName("myjavaproject.Employee");
// Get class Name
System.out.println(name.getName());
// Get Package
System.out.println(name.getPackageName());
System.out.println(name.getTypeName());
Arrays.stream(name.getDeclaredConstructors()).forEach(System.out::println);
Arrays.stream(name.getDeclaredFields()).forEach(System.out::println);
Arrays.stream(name.getDeclaredMethods()).forEach(System.out::println);
}
}
我的 myjavaproject。员工 my javap project my javap project。员工 myjavaproject。Employee(int,Java . lang . String)int myjavaproject。employee . empid Java . lang . string my javap project。employee . name void my javap project。Employee.showInfo()
示例:获取字段元数据
为了处理类字段,Java 提供了一个位于 java.lang.reflect 包中的 Field 类。此类包含有助于获取字段元数据的方法。在这个例子中,您可以看到我们使用了 class.forName 来加载类,然后使用 Field 类来获取类的元数据。
package myjavaproject;
import java.lang.reflect.Field;
// Employee Class
class Employee{
// Fields
int empId;
String name;
// Constructor
Employee(int empId, String name){
this.empId = empId;
this.name = name;
}
// Method
void showInfo() {
System.out.println("Employee Id: "+empId);
System.out.println("Employee Name: "+name);
}
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
// Employee class
Class name = Class.forName("myjavaproject.Employee");
// Get Fields metadata
Field[] field = name.getDeclaredFields();
for(Field f: field) {
System.out.print(f.getType()+" ");
System.out.println(f.getName());
System.out.println(f.getModifiers());
}
}
}
int empId 0 类 java.lang.String 名称 0
示例:获取方法元数据
为了处理类方法,Java 提供了一个位于 java.lang.reflect 包中的方法类。此类包含有助于获取方法元数据的方法。在这个例子中,您可以看到我们使用了 class.forName 来加载类,然后使用 Method 类来获取方法的元数据。
import java.lang.reflect.Method;
// Employee Class
class Employee{
// Fields
int empId;
String name;
// Constructor
Employee(int empId, String name){
this.empId = empId;
this.name = name;
}
// Method
void showInfo() {
System.out.println("Employee Id: "+empId);
System.out.println("Employee Name: "+name);
}
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
// Employee class
Class name = Class.forName("myjavaproject.Employee");
// Get method metadata
Method[] method = name.getDeclaredMethods();
for(Method m: method) {
System.out.println(m);
System.out.println(m.getDefaultValue());
System.out.println(m.getModifiers());
System.out.println(m.getName());
System.out.println(m.getParameterCount());
System.out.println(m.getReturnType());
}
}
}
void myjavaproject。employee . ShowInfo()null 0 ShowInfo 0 无效
示例:获取构造器元数据
一个类可能有几个构造器,包括参数化的和非参数化的。Java 反射提供了由方法组成的构造器类,可以用来获取构造器的元数据。在这个例子中,我们使用构造器类及其方法来获取构造器的元数据。请看下面的例子。
package myjavaproject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;
// Employee Class
class Employee{
// Fields
int empId;
String name;
// Constructor
Employee(int empId, String name){
this.empId = empId;
this.name = name;
}
// Method
void showInfo() {
System.out.println("Employee Id: "+empId);
System.out.println("Employee Name: "+name);
}
}
class Demo{
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
// Employee class
Class name = Class.forName("myjavaproject.Employee");
// Get method metadata
Constructor[] constructor = name.getDeclaredConstructors();
for(Constructor c: constructor) {
System.out.println(c);
System.out.println(c.getModifiers());
System.out.println(c.getName());
System.out.println(c.getParameterCount());
System.out.println(c.getDeclaringClass());
Parameter[] parameters = c.getParameters();
for(Parameter p : parameters) {
System.out.println(p);
}
Class[] pt = c.getParameterTypes();
for(Class s : pt) {
System.out.println(s);
}
}
}
}
我的 myjavaproject。Employee(int,Java . lang . string)0 my javaproject。员工 2 类 myjavaproject。employee int arg 0 Java . lang . string arg 1 int class Java . lang . strings
getConstructors()和 getDeclaredConstructors()
getConstructors()
方法返回表示调用对象的所有公共构造器的构造器对象数组。记住,这个方法只返回公共构造器。如果你想看到一个类的所有声明的构造器,那么使用getDeclaredConstructors()
。以下是两者的一般语法,
**Constructor**< ?>[] *getConstructors*();
**Constructor**< ?>[] *getDeclaredConstructors*();
示例:getConstructors()和 getDeclaredConstructors()方法
这两种方法都用于获取类构造器,但是getConstructors()
只返回公共构造器,而getDeclaredConstructors()
返回所有可用的构造器。
import java.lang.reflect.*;
class Student
{
public Student(){}
public Student(String name){}
}
class Test
{
public static void main(String args[])
{
try
{
Class c = Class.forName("Student");
Constructor< Student>[] ct = c.getConstructors();
for(int i=0; i< ct.length; i++)
{ System.out.println(ct[i]); }
Constructor< Student>[]cdt = c.getDeclaredConstructors();
for(int i=0;i< cdt.length;i++)
{ System.out.println(cdt[i]);}
}
catch(Exception e)
{ e.printStackTrace();}
}
}
公共学生公共学生公共学生公共学生
getMethods()和 getDeclaredMethods()
getMethods()
方法返回 method 对象的数组,该数组反映调用对象的所有公共方法。getDeclaredMethods()
只返回调用类对象的声明方法。两者语法如下:
**Method**< ?>[] *getMethods*();
**Method**< ?>[] *getDeclaredMethods*();
示例:getDeclaredMethods()方法
让我们举一个例子,在这个例子中,我们使用getDeclaredMethods()
方法来获取类中所有声明的方法。见下面的例子。
import java.lang.reflect.*;
class Student
{
public void show(){}
void display(){}
}
class Test
{
public static void main(String args[])
{
try
{
Class c = Class.forName("Student");
Method md[] = c.getDeclaredMethods();
for(int i=0; i< md.length; i++ )
{ System.out.println(md[i]); }
}
catch(Exception e)
{ e.printStackTrace();}
}
}
公共 void Student.show()
getFields()和 getDeclaredFields()
getFields()
返回一个包含 Field 对象的数组,该数组反映了该 class 对象表示的类或接口的所有可访问的公共成员。getDeclaredFields()
返回一个字段对象数组,该数组反映了该类对象所代表的类或接口所声明的所有字段。
**Field**< ?>[] *getFields*();
**Field**< ?>[] *getDeclaredFields*();
示例:getFields()和 getDeclaredFields()方法
要获取一个类的字段,我们可以使用getFields()
或getDeclaredFields()
方法。除了 getFields 只返回公共字段之外,两者都返回字段。见下面的例子。
import java.lang.reflect.*;
class Student
{
public String name;
int roll;
}
class Test
{
public static void main(String args[])
{
try
{
Class c = Class.forName("Student");
Field ff[] = c.getFields();
for(int i=0; i< ff.length; i++)
{ System.out.println(ff[i]); }
Field f[] = c.getDeclaredFields();
for(int i=0;i< f.length; i++)
{ System.out.println(f[i]); }
}
catch(Exception e)
{ e.printStackTrace();}
}
}
public Java . lang . string student . name public Java . lang . string student . name int student . roll