0% found this document useful (0 votes)
9 views43 pages

10-javareflection

The document outlines the Java Reflection API, detailing its purpose, architecture, and usage. It explains how reflection allows programs to examine and manipulate classes, methods, and fields at runtime, and includes examples of invoking methods and working with arrays. The content is structured around session objectives, providing insights into accessing class information and creating instances dynamically.

Uploaded by

ngyntantai76
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views43 pages

10-javareflection

The document outlines the Java Reflection API, detailing its purpose, architecture, and usage. It explains how reflection allows programs to examine and manipulate classes, methods, and fields at runtime, and includes examples of invoking methods and working with arrays. The content is structured around session objectives, providing insights into accessing class information and creating instances dynamically.

Uploaded by

ngyntantai76
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 43

Java Programming

Course

Reflection API

Faculty of Information Technologies


Industrial University of Ho Chi Minh City

1
Session objectives

1. Introduction
2. The Class object
1. Getting Constructors
2. Getting Fields
3. Getting Methods
4. Array Object
3. Invoke methods dynamically

2
Java looking at Java

• One of the unusual capabilities of Java is that a program can


examine itself
o You can determine the class of an object
o You can find out all about a class: its access modifiers,
superclass, fields, constructors, and methods
o You can find out what what is in an interface
o Even if you don’t know the names of things when you write
the program, you can:
• Create an instance of a class
• Get and set instance variables
• Invoke a method on an object
• Create and manipulate arrays
3
What is reflection for?

• In “normal” programs you don’t need reflection


• You do need reflection if you are working with programs that
process programs
• Typical examples:
o A class browser
o A debugger
o A GUI builder
o An IDE, such as BlueJ, Netbeans oe eclipse
o A program to grade student programs

4
Reflection

• Reflection là kĩ thuật rất cần thiết để lấy các thông


tin của một kiểu dữ liệu.
• Dựa vào đó ta có thể kích hoạt (như các phương
thức) hoặc tạo thể hiện của kiểu dữ liệu đó

5
Kiến trúc của Java Reflection API

• Các lớp được dùng trong reflection nằm trong hai package là
java.lang và java.lang.reflect.
• Package java.lang.reflect bao gồm ba lớp chính cần biết là
Constructor, Field và Method

6
Kiến trúc của Java Reflection API

• Class<T>: lớp này đại diện cho các lớp, interface và chứa các

phương thức dùng để lấy các đối tượng kiểu Constructor, Field,

Method,…

• AccessibleObject: các kiểm tra về phạm vi truy xuất (public,

private, protected) của field, method, constructor sẽ được bỏ qua.

Constructor: chứa các thông tin về một constructor của lớp.

• Field: chứa các thông tin về một field của lớp, interface.

• Method: chứa các thông tin về một phương thức của lớp, interface.

7
Tạo đối tượng Class<>
• Đối tượng kiểu này được tạo ra bằng cách sử dụng phương thức
static Class.forName():

Class<?> cls = Class.forName("demo.NhanVien");


==> ClassNotFoundException

Class cls = demo.NhanVien.class;

8
The Class class
• To find out about a class, first get its Class object
o If you have an object obj, you can get its class object with
Class c = obj.getClass();
o You can get the class object for the superclass of a Class c
with
Class sup = c.getSuperclass();
o If you know the name of a class (say, Button) at compile
time, you can get its class object with
Class c = Button.class;
o If you know the name of a class at run time (in a String
variable str), you can get its class object with
Class c = class.forName(str);
9
Getting the class name

• If you have a class object c, you can get the name of the class
with c.getName()
• getName returns the fully qualified name; that is,
Class c = Button.class;
String s = c.getName();
System.out.println(s);
will print
java.awt.Button
• Class Class and its methods are in java.lang, which is always
imported and available

10
Getting all the superclasses

• getSuperclass() returns a Class object (or null if you call


it on Object, which has no superclass)

• Example

11
Getting the class modifiers I

• The modifiers (e.g., public, final, abstract etc.) of a Class object is


encoded in an int and can be queried by the method getModifiers().
• To decode the int result, we need methods of the Modifier class, which is
in java.lang.reflect, so:
import java.lang.reflect.*;
• Then we can do things like:
if (Modifier.isPublic(m))
System.out.println("public");
• Or
String modifier=
Modifier.toString(cls.getModifiers())
System.out.println(modifier);
12
Getting the class modifiers II

• Modifier contains these methods (among others):


o public static boolean isAbstract(int)
o public static boolean isFinal(int)
o public static boolean isInterface(int)
o public static boolean isPrivate(int)
o public static boolean isProtected(int)
o public static boolean isPublic(int)
o public static String toString(int)
• This will return a string such as
"public final synchronized strictfp"

13
Getting interfaces

• A class can implement zero or more interfaces


• getInterfaces() returns an array of Class objects
• Ex:

14
Examining classes and interfaces

• The class Class represents both classes and interfaces


• To determine if a given Class object c is an interface, use
c.isInterface()
• To find out more about a class object, use:
o getModifiers()
o getFields() // "fields" == "instance variables"
o getConstructors()
o getMethods()
o isArray()

15
Getting Fields

• public Field[] getFields() throws SecurityException


o Returns an array of public Fields (including inherited fields).
o The length of the array may be zero
o The fields are not returned in any particular order
o Both locally defined and inherited instance variables are
returned, but not static variables.
• public Field getField(String name)
throws NoSuchFieldException, SecurityException
o Returns the named public Field
o If no immediate field is found, the superclasses and interfaces
are searched recursively
16
Using Fields (1)

• If f is a Field object, then


o f.getName() returns the simple name of the field
o f.getType() returns the type (Class) of the field
o f.getModifiers() returns the Modifiers of the field
o f.toString() returns a String containing access modifiers, the type,
and the fully qualified field name

• Example: public java.lang.String Person.name

o f.getDeclaringClass() returns the Class in which this field is


declared

• note: getFields() may return superclass fields. 17


Using Fields (2)

• The fields of a particular object obj may be accessed with:


o boolean f.getBoolean(obj), int f.getInt(obj), double
f.getDouble(obj), etc., return the value of the field, assuming it is
that type or can be widened to that type
o Object f.get(obj) returns the value of the field, assuming it is an
Object
o void f.set(obj, value), void f.setBoolean(obj, bool), void f.setInt(obj,
i), void f.getDouble(obj, d), etc. set the value of a field

18
Getting Constructors of a class

• if c is a Class, then
• c.getConstructors() : Constructor[] return an array of all public
constructors of class c.
• c.getConstructor( Class … paramTypes ) returns a constructor
whose parameter types match those given paramTypes.
Ex:
• String.class.getConstructors().length
> 15;
• String.class.getConstructor( char[].class, int.class,
int.class).toString()
> String(char[], int,int).
19
Constructors

• If c is a Constructor object, then


o c.getName() returns the name of the constructor, as a String (this is
the same as the name of the class)
o c.getDeclaringClass() returns the Class in which this constructor is
declared
o c.getModifiers() returns the Modifiers of the constructor
o c.getParameterTypes() returns an array of Class objects, in
declaration order
o c.newInstance(Object… init_args) creates and returns a new instance
of class c
• Arguments that should be primitives are automatically unwrapped as
needed
20
Example

• Constructor c = String.class.getConstrucor( char[].class,


int.class, int.class).toString()
 String(char[], int,int).

• String s = c.newInstance(
new char[] {‘a’,’b’,’c’,’d’ }, 1, 2 );
• assert s == “bc”;

21
Example

22
Methods

• public Method[] getMethods()


throws SecurityException
o Returns an array of Method objects
o These are the public member methods of the class or interface,
including inherited methods
o The methods are returned in no particular order

• public Method getMethod(String name,


Class… parameterTypes)
throws NoSuchMethodException,
SecurityException
23
Methods

• getDeclaringClass()
o Returns the Class object representing the class or

interface that declares the method represented by


this Method object
• getName()
o Returns the name of the method represented by

this Method object, as a String


• getModifiers()
o Returns the Java language modifiers for the

method represented by this Method object, as an


integer
• getParameterTypes()
o Returns an array of Class objects that represent

the formal parameter types, in declaration order,


of the method represented by this Method object
24
Methods

25
Methods

• getReturnType()
o Returns a Class object that represents the formal return type
of the method represented by this Method object
• toString()
o Returns a String describing this Method (typically pretty
long)
• public Object invoke(Object obj, Object… args)
o Invokes the underlying method represented by this Method
object, on the specified object with the specified parameters
o Individual parameters are automatically unwrapped to match
primitive formal parameters 26
Examples of invoke()

• “abcdefg”.length()
> 7
• Method lengthMethod = String.class.getMethod(“length”) ;
• lengthMethod.invoke(“abcdefg”)
>7
• “abcdefg”.substring(2, 5)
> cde
• Method substringMethod = String.class.getMethod
( “substring”, int.class, Integer.TYPE ) ;
• substringEMthod.invoke( “abcdefg”, 2, new Integer(5) )
> cde 27
Examples of invoke()

28
Arrays I

• To determine whether an object obj is an array,


o Get its class c with Class c = obj.getClass();
o Test with c.isArray()

• To find the type of components of the array,


o c.getComponentType()
• Returns null if c is not the class of an array

• Ex:
o int[].class.isArray() == true ;
o int[].class.getComponentType() == int.class

29
Arrays II

• The Array class in java.lang.reflect provides static methods for


working with arrays
• To create an array,
• Array.newInstance(Class componentType, int size)
o This returns, as an Object, the newly created array
• You can cast it to the desired type if you like
o The componentType may itself be an array
• This would create a multiple-dimensioned array
• The limit on the number of dimensions is usually 255

• Array.newInstance(Class componentType, int… sizes)


o This returns, as an Object, the newly created multidimensional
array (with sizes.length dimensions)
30
Examples

• The following two objects are of the same type:


o new String[10]
o Array.newInstance(String.class, 10)

• The following two objects are of the same type:


o new String[10][20]
o Array.newInstance(String.class, 10, 20)

31
Arrays III

• To get the value of array elements,


o Array.get(Object array, int index) returns an Object
o Array.getBoolean(Object array, int index) returns a boolean
o Array.getByte(Object array, int index) returns a byte
o etc.
• To store values into an array,
o Array.set(Object array, int index, Object value)
o Array.setInt(Object array, int index, int i)
o Array.setFloat(Object array, int index, float f)
o etc.

32
Examples

• a = new int[] {1,2,3,4};


• Array.getInt(a, 2) //  3
• Array.setInt(a, 3, 5 ) // a = {1,2,3, 5 }.

• s = new String[] { “ab”, “bc”, “cd” };


• Array.get(s, 1 ) //  “bc”
• Array.set(s, 1, “xxx”) // s[1] = “xxx”

33
Array example

Output

34
Getting non-public members of a class

• All getXXX() methods of Class mentioned above return only public


members of the target (as well as ancestor ) classes, but they
cannot return non-public members.
• There are another set of getDeclaredXXX() methods in Class that
will return all (even private or static ) members of target class but
no inherited members are included.
• getDeclaredConstructors(), defDeclaredConstrucor(Class…)
• getDeclaredFields(),
getDeclaredField(String)
• getDeclaredmethods(),
getDeclaredMethod(String, Class…)
35
Example

• String.class.getConstructors().length
> 15
• String.class.getDeclaredConstructors().length
> 16.
• Constructor[] cs = String.class.getDeclaredConstructors();
for(Constructor c : cs)
if( ! (Modifier.isPublic(c.getModifiers())))
out.println(c);
> java.lang.String(int,int,char[]) // package

36
Create object at runtime

Example class

37
Create object dynamically

38
Call method dynamically

39
ClassLoader

• Dùng URI để đọc nội dung class lên 1 mảng bytes


• Subclassing lớp ClassLoader để tạo đối tượng Class
• Xử lý

40
Concluding comments

• Many of these methods throw exceptions not described here


o For details, see the Java API

• Reflection isn’t used in “normal” programs, but when you


need it, it’s indispensable
• Studying the java reflection package gives you a chance to
review the basics of java class structure.

41
FAQ

42
That’s all for this session!

Thank you all for your attention and


patient !

43
43/2

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy