Metaprograms
and
metadata
Prof. Dr. Ralf Lämmel
Universität Koblenz-Landau
Software Languages Team
Motivation
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Elevator speech
So programs are program...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Metaprogramming terminology
• A metapro...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Examples of metaprograms
• A Java progr...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Scenario
• Create an object through ref...
Reflection
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Java’s “built-in” reflection
Basics (Cov...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.Class
• Represents classes (a...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.Class
interface
• Map strings...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.reflect.Method
• Represents m...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.reflect.Method
interface
• Ge...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.reflect.Field
Provides inform...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.reflect.Field
interface
• Get...
Reflection examples
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Scenario
• Given an object of an arbitr...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Total and cut
with the help of reflecti...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
A challenge for (Java) reflection
Given ...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Find and load all classes of a package
...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Find (and load) all classes in a given ...
Metadata
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Metaprograms vs. metadata
Metaprograms ...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Sample annotation
@Test
	 public void t...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Annotations
Data associated with method...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Sample annotation
@RequestForEnhancemen...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Annotation declaration
for sample annot...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Annotation rules
• An annotation decl t...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Meta-annotations
aka Metametadata
• @Do...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Scenario
• Take a class name as argumen...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Summary
• Meta-programming comes in man...
More references.
FYI
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Extra meta-programming power
for Java
•...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Further reading: Beyond Java
July 1991
...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Seminal references
• Brian C. Smith. Re...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Online resources on Java reflection
Seri...
Reflective proxies
Optional; beware:
advanced example.
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Reflection-based proxies
Remember the Pr...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Scenario
• Taken an object of any type....
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.reflect.Proxy
• Proxy provide...
(C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
java.lang.reflect.Proxy
If XYZ is an in...
Upcoming SlideShare
Loading in …5
×

Metaprograms and metadata (as part of the the PTT lecture)

1,003 views

Published on

One

Published in: Technology, News & Politics
3 Comments
0 Likes
Statistics
Notes
  • You may find some useful presentations in the boostcon (C++Now) presentation repository at https://github.com/boostcon. This (http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06.html) book chapter seems to give an exhaustive treatment to different basic flavors of C++ template meta-programming.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • I totally agree with you Sumant! I should really add some compile-time reflection, perhaps based on C++. Is there some ready to teach material out there?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Interesting presentation! Java provides run-time reflection and it is slow. C++ meta-programs are compile-time. The compiler can optimize the resulting program for speed after the meta-program has run. So C++ meta-programs can/are used to speed up run-time programs.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
1,003
On SlideShare
0
From Embeds
0
Number of Embeds
206
Actions
Shares
0
Downloads
13
Comments
3
Likes
0
Embeds 0
No embeds

No notes for slide

Metaprograms and metadata (as part of the the PTT lecture)

  1. 1. Metaprograms and metadata Prof. Dr. Ralf Lämmel Universität Koblenz-Landau Software Languages Team
  2. 2. Motivation
  3. 3. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Elevator speech So programs are programs and data is data. Or perhaps programs could be data? Or rather data could be programs? What if programs process data representing programs? Those are metaprograms. (Reflection is an important way of doing metaprogramming.) What if data represents data about programs? This is metadata. Programming is for kids. Metaprogramming is for men nerds.
  4. 4. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Metaprogramming terminology • A metaprogram is a program that manipulates other programs. That is, programs correspond to data of metaprograms. • The language in which the metaprogram is written is called the metalanguage. The language of the programs that are manipulated is called the object language. • The ability of a programming language to be its own metalanguage is called reflection . If reflection is limited to “read access”, then this is called introspection. • Reflection can be achieved in very different ways: – API-based access to program (Java). – Special language and compiler support (C++ templates).
  5. 5. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Examples of metaprograms • A Java program that pretty prints arithmetic expressions. • … evaluates them. • … transforms them (e.g., optimizes them). • A Java compiler because: – it inspects Java code, and – it produces byte code. • If the Java compiler is written in Java, it is a reflective meta-program; if it is written in Haskell instead, it is just a meta-program. • A byte-code engineering program because it analyses, generates, or transforms programs in JVM byte code. • …
  6. 6. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Scenario • Create an object through reflection API • Invoke a method through reflection API Why is this interesting? • Imagine the class or the method are not known until runtime. The “Hello World” of java.lang.reflect DEMO See package helloworld of https://github.com/101companies/101repo/tree/master/ technologies/Java_platform/samples/javaReflectionSamples
  7. 7. Reflection
  8. 8. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Java’s “built-in” reflection Basics (Covered today) • java.lang.Class • java.lang.reflect.Field • java.lang.reflect.Method • java.lang.reflect.Constructor Advanced (Optional material included) • java.lang.reflect.Proxy Object model for object models Deep support for dynamic classes and the proxy design pattern
  9. 9. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.Class • Represents classes (and interfaces) in a Java app. • Each object knows of its class: obj.getClass() • Each class knows of its class: String.class • Primitive types have an associated class. • Even void has an associated class. • Class cannot be regularly instantiated. • Instead the class loader uses defineClass: – Input: byte code – Output: an instance of type Class To treat argument and result types homogeneously and precisely
  10. 10. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.Class interface • Map strings to class objects (forName) • Getter – Name – Constructors – Fields – Methods – Interfaces – Annotations – Package – Superclass – Enclosing class • NO SETTERS • Various other inspectors (“tests”) • Instantiation (but see constructors) • Cast operations • … This is one manifestation of Java’s reflection to focus on introspection.
  11. 11. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.reflect.Method • Represents methods – … of classes and interfaces – static, initialization, instance, and abstract methods • Constructors are treated very similar; see: – java.lang.reflect.Constructor • Does not provide byte-code access. • Returned by getters on java.lang.Class. • NO METHOD BODIES
  12. 12. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.reflect.Method interface • Getters – Name – Parameter types – Return type – Type parameters – Class – Modifiers – Annotations – Parameter annotations – … • Invocation
  13. 13. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.reflect.Field Provides information about fields. Provides dynamic access to fields.
  14. 14. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.reflect.Field interface • Getters –Name –Value (for a given object) –Modifiers –Annotations –… • Setters –Value (for a given object)
  15. 15. Reflection examples
  16. 16. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Scenario • Given an object of an arbitrary type. • Provide a deep dump on the state of the object. • That is, go over the fields recursively. An object dumper DEMO See package dumper of https://github.com/101companies/101repo/tree/master/ technologies/Java_platform/samples/javaReflectionSamples
  17. 17. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Total and cut with the help of reflection. 295 DEMO http://101companies.org/wiki/ Contribution:javaReflection Please note the conciseness of the code compared to javaComposition, for example.
  18. 18. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) A challenge for (Java) reflection Given a class, what are the subclasses of it? Alas, there is no such member on “Class”. The set of classes known to the system is simply the set of classes loaded so far. One could assume a scan over the full classpath to get to know more classes, but automatically loading all these classes is expensive and may not be intended.
  19. 19. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Find and load all classes of a package 297 DEMO See package packagelist of https://github.com/101companies/101repo/tree/master/ technologies/Java_platform/samples/javaReflectionSamples
  20. 20. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Find (and load) all classes in a given package. The search relies on a directory listing. public static Iterable<Class<?>> getClassesInPackage(Package p) { LinkedList<Class<?>> l = new LinkedList<Class<?>>(); String name = p.getName(); name = name.replace('.',File.separatorChar); File dir = new File(name); if (!dir.exists()) throw new RuntimeException("Can't find package!"); for (String f : dir.list()) { String classname = f.substring(0,f.length()-6); try { Class<?> clss = Class.forName(p.getName() + "." + classname); l.add(clss); } catch (ClassNotFoundException e) { // Ignore exception } } return l; } Instead of using the classpath, we assume a translation of the package name to the location in the file system.
  21. 21. Metadata
  22. 22. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Metaprograms vs. metadata Metaprograms are programs that generate, analyze, or control other programs. Metadata (generally) is data that is attached to programs or other data to provide additional information (in particular, application-specific information) for programs and data. In Java, we can use annotations for metadata. It happens that metaprograms often need annotations.
  23. 23. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Sample annotation @Test public void testTotal() throws Exception { Document doc = DOMUtilities.loadDocument(sampleCompany); double total = total(doc); assertEquals(399747, total, 0); }
  24. 24. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Annotations Data associated with methods, fields, class, etc. that does not affect the semantics of a program, but controls metaprograms over the annotated object programs. Scenarios: • Identify test methods and control execution (JUnit) • Control serialization of objects as XML (JAXB) • ... many other frameworks ... .NET uses the term “custom attributes”; Java “adopted” them and called them annotations
  25. 25. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Sample annotation @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) Public void travelThroughTime(Date destination) { ... } “=“ notation can be omitted if there is only a single method of name value.
  26. 26. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Annotation declaration for sample annotation /** * Describes a Request-For-Enhancement(RFE) * for the API element at hand */ public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date(); default "[unimplemented]"; } Thus, annotation declarations are somewhat specific interface declarations.
  27. 27. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Annotation rules • An annotation decl takes the form of interface decl except that … – they start with an 'at' sign @; – their method declarations must not have any parameters; – … and must not have any throws clauses; – their return types of the method must be one of the following: • Primitive types; • String; • Class; • Enum; • Array types of the above types; – there may be a default for each method.
  28. 28. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Meta-annotations aka Metametadata • @Documented – controls whether or not the declarations should be visible when targets are documented in any way. • @Inherited – controls whether or not a subclass (or a member thereof) inherits the annotation when the superclass (or a member thereof) was target. • @Retention – (runtime, source, …) controls whether the annotation will be available, accessible during runtime. • @Target – (field, method, type, …, annotation) the kind of declaration to which the annotation can be attached.
  29. 29. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Scenario • Take a class name as argument. • Find all “test” methods in the class. • Execute them. • Keep a record of success and failure. A tiny approximation of JUnit 307 DEMO See package junitlight of https://github.com/101companies/101repo/tree/master/ technologies/Java_platform/samples/javaReflectionSamples
  30. 30. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Summary • Meta-programming comes in many forms: – Analyze – Transform – Generate – Compose Code, where code is … – Java source code, or – JVM byte code. • Meta-programming is used/needed all over the place: – By the compiler – By IDE and tool support (JUnit, …) – By application generators – By mapping tools (X/O/R) – … Programming is for casual hackers; meta-programming is for real men nerds.
  31. 31. More references. FYI
  32. 32. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Extra meta-programming power for Java • BCEL, ASM, ... – Byte-code engineering libraries • Javassist – Byte-code editing also at source level • com.sun.source.tree – Compiler Tree API • … various other technologies Related topics: code generation and analysis • “Code-Generation Techniques for Java”, article at OnJava.com • “Generate Java Code”, article at codefutures.com • “Source Code Analysis Using Java 6 APIs", article Java.net References - FYI
  33. 33. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Further reading: Beyond Java July 1991 7 x 9, 348 pp., 9 illus. $45.00/£29.95 (PAPER) Short ISBN-10: 0-262-61074-4 ISBN-13: 978-0-262-61074-2 References - FYI
  34. 34. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Seminal references • Brian C. Smith. Reflection and semantics in lisp. In Conference Record of the Eleventh Annual ACM Symposium on Principles of Programming Languages, pages 23--35. ACM Press, January 1984. • Daniel P. Friedman and Mitchell Wand. Reification: Reflection without metaphysics. In Conference Record of the 1984 ACM Symposium on LISP and Functional Programming, pages 348--355, Austin, Texas, August 1984. ACM Press. • Mitchell Wand and Daniel P. Friedman. The mystery of the tower revealed: A non-reflective description of the reflective tower. Lisp and Symbolic Computation, 1(1):11--38, June 1988. • Stanley Jefferson and Daniel P. Friedman. A simple reflective interpreter. Lisp and Symbolic Computation, 9(2/3):181--202, May/June 1996. References - FYI
  35. 35. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Online resources on Java reflection Series at IBM developerWorks • Part 1: Classes and class loading • Part 2: Introducing reflection • Part 3: Applied reflection • Part 4: Class transformation with Javassist • Part 5: Transforming classes on-the-fly • Part 6: Aspect-oriented changes with Javassist • Part 7: Bytecode engineering with BCEL • Part 8: Replacing reflection with code generation Miscellaneous • Another simple reflection tutorial • “Reflection API Code Samples”, samples @ SDN • More on class loading: – “Inside Class Loaders”, article at OnJava.com – “Create a custom Java 1.2-style ClassLoader”, article at JavaWorld.com References - FYI
  36. 36. Reflective proxies Optional; beware: advanced example.
  37. 37. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Reflection-based proxies Remember the Proxy Pattern? Optional; beware: advanced example.
  38. 38. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) Scenario • Taken an object of any type. • Return a proxy for that object. • Forward all methods from proxy to real subject. • In addition, produce tracing information. A tracer proxy for any given object DEMO Optional; beware: advanced example. See package tracer of https://github.com/101companies/101repo/tree/master/ technologies/Java_platform/samples/javaReflectionSamples
  39. 39. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.reflect.Proxy • Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods. • A (dynamic) proxy class is a class that implements a list of interfaces specified at runtime when the class is created. • A proxy interface is such an interface that is implemented by a proxy class. • A proxy instance is an instance of a proxy class. Each proxy instance has an associated invocation handler object, which implements the interface InvocationHandler. A method invocation on a proxy instance through one of its proxy interfaces will be dispatched to the invoke method of the instance's invocation handler. Optional; beware: advanced example.
  40. 40. (C) 2010-2013 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable) java.lang.reflect.Proxy If XYZ is an interface passed as an argument in the creation of the proxy class, and obj is an instance of the proxy class, then the following operations are valid: • obj instanceof XYZ • (XYZ) obj Optional; beware: advanced example.

×